Последние темы


Плагин расчета скидки от суммы заказа

  • Доброго всем дня.
    Стоит следующая задача:
    Есть несколько цен: цена1 цена2 и т.д.
    Необходимо сделать плагин, который будет менять цену заказе в зависимости от цены.
    Например, если стоимость всего заказа достигает 30000 р. нужно подставить на все позиции заказа вместо цена1 цену2.
    Вот то, что пока написал, но не работает:

    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
     global $modx;
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    if ($modx->event->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $price = Get_Price($id,$price_tota);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $modx->event->_output = '';
    return '';
    }
    

    Подскажите в какую сторону смотреть

  • Изменение цены реализовал, все корректно.
    Вот код плагина:

    <?php
    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
     global $modx;
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    if ($modx->event->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $price = Get_Price($id,$price_total);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $modx->event->_output = '';
    return '';
    }
    

    Теперь другой вопрос.
    При пересчете корзины не выводится сумма заказа. Знатоки, как исправить?.

  • Решил вопрос, но через костыль. Почему-то сумма заказа из плагина не выводится в плэйсхолдер [[+price_total]], зато в любой другой за милую душу.
    Код плагина ниже, может кому пригодится:

    <?php
    /**
    * OnSHKsaveOrder
    *  
    * @internal    @events OnSHKcalcTotalPrice
    *
    */
    /*Функция для определения цены исходя из суммы заказанного товара*/
    
    if(!function_exists(Get_Price)){
    function Get_Price($id,$price_tota) {
    global $modx; 
     $resource = $modx->getObject('modResource',array('id'=>$id));
     $price = $resource->getTVValue('price');//Значение TV-розничная цена
     $price2 = $resource->getTVValue('price_opt1');//оптовая цена при 30000
     $price3 = $resource->getTVValue('price_opt2');//оптовая цена при 60000
     $price4 = $resource->getTVValue('price_opt3');//оптовая цена при 90000
     $minzakaz_price1 = 30000;//опт минимальная цена 1
     $minzakaz_price2 = 60000;//опт минимальная цена 2
     $minzakaz_price3 = 90000;//опт минимальная цена 3
    
     if ($price_tota < $minzakaz_price1)  $price = $price; //цена до первой оптовой цены
     elseif ($price_tota >= $minzakaz_price1){
     	if ($price2 > 0) $price = $price2; /*цена, если больше или равно 30000 */
     }
     if ($price_tota >= $minzakaz_price2) $price = $price3;
     if ($price_tota >= $minzakaz_price3) $price = $price4;
       return $price;
     }
    }
    /*Собственно плагин, который повешен на OnSHKcalcTotalPrice*/
    $e = &$modx->Event;
    if ($e->name == 'OnSHKcalcTotalPrice'){
     if(!empty($_SESSION['shk_order'])){
       $purchases = $_SESSION['shk_order'];
      foreach($purchases as $key => $product){
     $id = $product['id']; 
             if (empty($id)) break;
    $id_tmp[$id]['id']= $key;
    $tmp_prtotal=$price_total;
    $price = Get_Price($id,$tmp_prtotal);
    $_SESSION['shk_order'][$key]['price']=$price;
     }
    }
    $tot=$price_total;
    $modx->setPlaceholder('total', "$tot");
    }
    

    Прошу прощения за говнокод, приведу в порядок в ближайшее время.

 

Последние комментарии

  • а редактируются они через CMP

    Покажите скриншот. Не понял что за CMP. Но если и не подвязаны, оставьте значение, которое было.
    Вот мой скриншот:
    0_1565682115311_screenshot_179.png

    Читать далее
  • D

    Участник @Andchir написал в Экспорт/импорт данных из таблиц пакетов MIGX db через плагин CatalogFill:

    MIGXDB

    какие родители в элементах migx db?
    это элементы, которые к ресурсам никак не подвязаны!
    а редактируются они через CMP

    Читать далее
  • //Название поля ID родителя $cf_config['parent_field'] = false;

    Почему так? В MIGXDB документы должны иметь родителя. Иначе как вы их добавляете/редактируете в админке?

    Читать далее
  • D

    отключил, очистил
    далее http://joxi.ru/12MEdEvtloelG2 -> http://joxi.ru/VrwXwXZt7RN7Mm
    в журнале ошибок - пусто
    код настройки

    <?php //Название класса таблицы товаров в БД $cf_config['className'] = 'delivery_flight'; //Название пакета таблицы товаров в БД $cf_config['packageName'] = 'delivery_schedule'; //Название поля ID родителя $cf_config['parent_field'] = false; //разбивка по столбцам при импорте и экспорте (content|tv|category) $cf_config['content_row'] = array( array('ID',array('id','content')), array('Наименование',array('name','content')), array('Время',array('time','content')), array('Откуда',array('from','content')), array('Время в пути',array('duration','content')), array('Куда',array('to','content')), array('Время прибытия',array('arrival_time','content')), array('Стоимость',array('price','content')), array('Тариф',array('delivery_rate_id','content')), array('Сортировка',array('sort','content')), ); //значения по умолчанию при импорте или проверка при экспорте $cf_config['imp_content_default'] = array( 'content' => array( 'deleted' => 0, 'published' => 1, //'template' => 9 'createdon' => strtotime("now") //'publishedon' => strtotime("now") //'pub_date' => strtotime("now") //'editedby' => 1 //'editedon' => strtotime("now") ), 'tv' => array( //7 => 0 ) ); //первая строка - названия полей $cf_config['include_captions'] = true; //число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать. $cf_config['batch_import'] = 300; //разбивать по категориям $cf_config['include_categories'] = false; //удалять дочерние категории при очистке и обновлении каталога $cf_config['delete_subcategories'] = true; //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_field'] = false; //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_tvid_val'] = false; //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field) $cf_config['imp_if_not_exist'] = true; //удалять HTML-теги при экспорте $cf_config['exp_strip_tags'] = false; //автоматически генерировать псевдоним (alias) при импорте //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит. $cf_config['imp_autoalias'] = false; //Изменить значения поля для всех вложенных товаров до начала импорта. //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе. //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым) $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены //удалить файл после экспорта (скачивания) $cf_config['exp_delete_file'] = false; //кодировка CSV-файла при экспорте $cf_config['exp_csv_charset'] = 'UTF-8'; //'windows-1251' //Импортировать (обновлять) пустые значения $cf_config['imp_empty'] = true; //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import". $cf_config['imp_custom_processor'] = ''; //путь (xpath) в XML структуре до товаров $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers'; //Структура XML файла для импорта $cf_config['imp_xml_structure'] = ''; //тестирование конфигурации (без записи в БД). Отчёты -> Журнал ошибок. $cf_config['imp_testmode'] = true; //функция для фильтрации значений при ИМПОРТЕ function filter_import($value_arr){ $output_arr = $value_arr; /* if(isset($output_arr['content']['pagetitle'])) $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8'); */ return $output_arr; } //функция для фильтрации значений при ЭКСПОРТЕ function filter_export($value_arr,$doc_id=0){ $output_arr = $value_arr; //var_dump($value_arr,$output_arr); //exit; /* if(isset($output_arr['price'])) $output_arr[1] = floatval($output_arr[1]) - 200; */ return $output_arr; } ?>

    shema пакета, для которого написана настройка

    <model package="delivery_schedule" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1"> <object class="delivery_rate" table="delivery_rates" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="color" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="desc" dbtype="text" phptype="string" null="false" default="" /> <field key="sort" dbtype="int" precision="10" phptype="integer" null="false" default="500"/> <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="1" /> <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/> </object> <object class="delivery_flight" table="delivery_flights" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="from" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="time" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="duration" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="to" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="arrival_time" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="price" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="sort" dbtype="int" precision="10" phptype="integer" null="false" default="500"/> <field key="delivery_rate_id" dbtype="int" precision="10" phptype="integer" null="false" default="0"/> <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="1" /> <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/> <aggregate alias="Delivery_rate" class="delivery_rate" local="delivery_rate_id" foreign="id" cardinality="one" owner="foreign" /> </object> </model>

    Читать далее