web3

web3

С нами с 13 сентября 2017; Место в рейтинге пользователей: #309
web3
20 июля 2018, 11:00
1
0
К сожалению, пример уже не смогу дать, исходников не осталось. Могу сказать, что код выше будет рабочим при небольшой допилке (переработать запрос к базе и добавить условие на параметр).
{if $.request['msoption|size']}
       {var $m = '!msOptionsPrice.modification'|snippet:[
       'product' => $id,
       'limit' => 1,
       'return' => 'data',
       'where' => ["msopModification.price >= "~$tmp[0]~" AND msopModification.price <= "~$tmp[1]~" AND msop_modification_options.value <= "~$.request['msoption|size']~" AND msop_modification_options.key =='size' "]],
       ] /*Это условие чуть исправить, оставить только присутствующие запросе поля*/
    } 
    {/if}
web3
20 июля 2018, 10:33
0
Требовалась работа только с 2-я параметрами. Делал по указаниям выше, только там сначала пришлось учитывать активные параметры и для конкретного набора параметров править запрос к базе. Не самое гибкое решение.
web3
05 декабря 2017, 12:32
0
Я правильно понимаю, что, для учета других свойств модификации требуется дописать в вызове сниппета следующее
{if $.request['msoption|size']}
       {var $m = '!msOptionsPrice.modification'|snippet:[
       'product' => $id,
       'limit' => 1,
       'return' => 'data',
       'where' => ["msopModification.price >= "~$tmp[0]~" AND msopModification.price <= "~$tmp[1]~" AND msop_modification_options.value <= "~$.request['msoption|size']~" AND msop_modification_options.key =='size' "]],
       ]}
    {/if}
web3
21 ноября 2017, 10:21
0
Только попробовал, выводит с учетом фильтра по ценам и потом сразу затирает, т.к. цены зависят не от одно параметра. Выше просто изменили цену на ближайшую подходящую, но при этом остальные параметры не изменили и не учитывали.
web3
16 ноября 2017, 12:40
0
Спасибо, все хорошо работает. Но все же остался один недостаток, с которым, наверное, придется смириться или очень долго исправлять. Теперь при выборе цены в верхнем диапазоне, товары фильтруются правильно, но отображаются с базовыми ценами, цены меняются только при выборе какой-либо из опций…
web3
16 ноября 2017, 12:20
0
Спасибо, это дало какое-то направление размышлений, но до конца, ясности так и не появилось. По идее, если я правильно понял, нужен стандартный метод для фильтрации по цене, но только он должен обращаться к другой таблице и выбирать другое поле.
web3
16 ноября 2017, 10:26
1
0
Уже не актуально, нашел что искал…
&sortOptions=`size:SORT_ASC:SORT_NUMERIC`
web3
16 ноября 2017, 09:46
2
0
Добрый день! Возможно ли как-то отсортировать вывод опций в другом порядке?
web3
16 ноября 2017, 07:48
0
С данным моментом разобрался, все отлично. Но, появился другой момент, как фильтровать по ценам модификаций, а не товаров? Получается что у товара цена указана 30к, в модификации цена 35к, а в фильтре максимальное 30к и получается дикая несуразица при взгляде на фильт с выведенными данными…
web3
15 ноября 2017, 12:57
1
0
Может кто сталкивался с изменением цен у товаров в каталоге при фильтрации? Фильтруешь товары с опциями, а в каталоге у товаров даже цена не изменяется. Это как-то решено?
web3
25 сентября 2017, 09:23
1
0
-Да, завязан жестко, т.к. не предполагалось унифицированного решения для всех, хотя такое имеет место быть. Связка упомянутых выше компонентов показалась наиболее удачным решением проблемы импорта и торговых предложений. А поделиться решил на тот случай, если будут такие же как я, нуждающиеся в импорте и примерах, хоть и кривых, но рабочих.
-В транслит перегоняю дабы оставить кириллические названия переменных от 1-с там где они есть и не плодить их дальше(хотя по всем данным, можно и кириллицу юзать без проблем, но не будем холиварить).
-По поводу того, что цены в это время где-то в сессии лежат в душе не чаял, если буду оптимизировать сей продукт учту.
-Тут есть грешок, исправил)
web3
19 сентября 2017, 07:45
1
0
Я правильно понял, что для создания модификации достаточно сформировать входной массив
$modification = array(
              'price' => $price,
              'old_price' => $old_price,
              'article' => $article,
              'weight' => '',
              'count' => $count,
              'options' => array(
                'color' =>  $color,
                'size' => $size
                )
        );
А затем вызвать событие
$modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
Окей, все сделал, но почему-то модификации не создались.
Вот что попадает во входные переменные
[mSyncOnProductOffers]int(162)/*это $rid*/
array(5) {/*а это $modification*/
  ["price"]=>
  string(6) "675.00"
  ["article"]=>
  int(2200000076250)
  ["weight"]=>
  string(0) ""
  ["count"]=>
  int(2)
  ["options"]=>
  array(2) {
    ["color"]=>
    string(12) "черный"
    ["size"]=>
    string(1) "M"
  }
}
web3
19 сентября 2017, 06:59
1
0
Только что попробовал, к сожалению без этого куска совсем не запустилось, не заполнились необходимые свойства и модификации было не из чего создавать…
web3
18 сентября 2017, 05:11
1
0
Плагин вешаем на событие «mSyncOnProductOffers».
web3
18 сентября 2017, 04:59
0
Все верно, пока есть не совсем аккуратная, но все же рабочая версия плагина.
Из необходимого, чтобы в системе не было переменных на русском при обработке их переводим, дабы создаем из необходимых данных массив с которым в последствии работаем. В конкретном случае обрабатываем торговые предложения, у которых есть несколько типов цен и пара характеристик, торговые предложения складываем как модификации из компонента msOptionPrise2.
<?php
if ($modx->event->name == 'mSyncOnProductOffers') {
    $object=$xml->ХарактеристикиТовара;
     $array = array();
     $trans = array(
    "а"=>"a",  "б"=>"b",  "в"=>"v",  "г"=>"g",
    "д"=>"d",  "е"=>"e",  "ё"=>"yo", "ж"=>"j",
    "з"=>"z",  "и"=>"i",  "й"=>"i",  "к"=>"k",
    "л"=>"l",  "м"=>"m",  "н"=>"n",  "о"=>"o",
    "п"=>"p",  "р"=>"r",  "с"=>"s",  "т"=>"t",
    "у"=>"y",  "ф"=>"f",  "х"=>"h",  "ц"=>"c",
    "ч"=>"ch", "ш"=>"sh", "щ"=>"sh", "ы"=>"i",
    "э"=>"e",  "ю"=>"u",  "я"=>"ya",

    "А"=>"A",  "Б"=>"B",  "В"=>"V",  "Г"=>"G",
    "Д"=>"D",  "Е"=>"E",  "Ё"=>"Yo", "Ж"=>"J",
    "З"=>"Z",  "И"=>"I",  "Й"=>"I",  "К"=>"K",
    "Л"=>"L",  "М"=>"M",  "Н"=>"N",  "О"=>"O",
    "П"=>"P",  "Р"=>"R",  "С"=>"S",  "Т"=>"T",
    "У"=>"Y",  "Ф"=>"F",  "Х"=>"H",  "Ц"=>"C",
    "Ч"=>"Ch", "Ш"=>"Sh", "Щ"=>"Sh", "Ы"=>"I",
    "Э"=>"E",  "Ю"=>"U",  "Я"=>"Ya",

    "ь"=>"",   "Ь"=>"",   "ъ"=>"",   "Ъ"=>""
);

    foreach( $object as $element) {
        foreach($element as $item){
            $name=strtr(addslashes((string)$item->Наименование), $trans);
            $value=addslashes((string)$item->Значение);
            $array[$name] = $value;
        }
    }
    $prices=$xml->Цены;
    foreach( $prices as $prices_element) {
        foreach($prices_element as $price_item){
            $price_type=addslashes((string)$price_item->ИдТипаЦены);
            $price_value=addslashes((string)$price_item->ЦенаЗаЕдиницу);
            $array[prices][$price_type] = $price_value;
        }
    }
    
    
    $id=addslashes((int)$resource->id);
    $array[id]=intval($id);
    $modx->log(4,var_dump($array));
    
     if(isset($array['Obhvat'])){
            $size=$array['Razmer']."/".$array['Obhvat'];
        }
        else{
            $size=$array['Razmer'];
        }
    if(isset($array['Cvet'])){
            $color=$array['Cvet'];
        }
    /*Тут сохраняется необходимая цена,т.к. присутствуют 3 типа цен(розница,акция и закупочная), используем только розницу и акцию, далее в зависимости от наличия цены по акции, если она есть, то отправляем ее в текущую цену, а розницу в старую цену.*/
    if(isset($array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"])){
        $price = $array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"];
        $old_price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    else{
        $price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    $rid =  $array[id];
    $mid=intval(addslashes((string)$xml->Штрихкод));
 
    $count=intval(addslashes((string)$xml->Количество));
    $article = $mid;
    /* опции модификации, тут вручную собираем нужные характеристики товара(опции) */
    $options = array(
        'color' =>  $color,
        'size' => $size
    );
    $msoptionsprice = $modx->getService('msoptionsprice');
    $msoptionsprice->initialize('web');
    /* создаем опции продукта */
    $options = $msoptionsprice->setProductOptions($rid, $options);
   
    
    /* создаем модификацию */
    if((isset($old_price))&&($old_price!=NULL)){
        $modification = array(
              'price' => $price,
              'old_price' => $old_price,
              'article' => $article,
              'weight' => '',
              'count' => $count,
              'options' => array(
                'color' =>  $color,
                'size' => $size
                )
        );
    }
    else{
         $modification = array(
          'price' => $price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'options' => array(
            'color' =>  $color,
            'size' => $size
            )
        );   
    }
    
     /* создаем опции модификации */
    $modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
    
}
return;
web3
15 сентября 2017, 10:36
1
0
Уже не актуально. Сделал сам.
web3
15 сентября 2017, 09:36
1
0
Сделал аналогично, не сработало. И ничего не написало.
if(isset($array['Obhvat'])){
            $size=$array['Razmer']."/".$array['Obhvat'];
        }
        else{
            $size=$array['Razmer'];
        }
    if(isset($array['Cvet'])){
            $color=$array['Cvet'];
        }
    
    if(isset($array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"])){
        $price = $array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"];
        $old_price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    else{
        $price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    $rid =  $array[id];
    $mid=intval(addslashes((string)$xml->Штрихкод));
 
    $count=intval(addslashes((string)$xml->Количество));
    $article = $mid;
    /* опции модификации */
    $options = array(
        'color' =>  $color,
        'size' => $size
    );
    $msoptionsprice = $modx->getService('msoptionsprice');
    $msoptionsprice->initialize('web');
    /* создаем опции продукта */
    //$options = $msoptionsprice->setProductOptions($rid, $options);
   
    
    /* создаем модификацию */
    if((isset($old_price))&&($old_price!=NULL)){
        $modification = array(
         
          'price' => $price,
          'old_price' => $old_price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'options' => array(
            'color' =>  $color,
            'size' => $size
            )
        );
    }
    else{
         $modification = array(
          'price' => $price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'options' => array(
            'color' =>  $color,
            'size' => $size
            )
        );   
    }
    
     /* создаем опции модификации */
    $modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
web3
15 сентября 2017, 08:38
1
0
Добрый день, попытался добавить опции товара по инструкции выше и что-то пошло не так. Создается модификация, но у нее нет свойств. Пытаюсь добавить еще одну вручную, а у нее уже есть 2 опции и другие выбрать не могу, удаляю одну из модификации и на ее месте появляется новое(такое же свойство) но с другим значением…
$rid =  $array[id];
    $mid=intval(addslashes((string)$xml->Штрихкод));
 
    $count=intval(addslashes((string)$xml->Количество));
    $article = $mid;
    /* опции модификации */
    $options = array(
        'color' =>  $color,
        'size' => $size
    );
    $corePath = $modx->getOption('msoptionsprice_core_path', null, $modx->getOption('core_path', null, MODX_CORE_PATH) . 'components/msoptionsprice/');
    $msoptionsprice = $modx->getService('msoptionsprice', 'msoptionsprice', $corePath . 'model/msoptionsprice/', array('core_path' => $corePath));
    /* создаем опции продукта */
    $options = $msoptionsprice->setProductOptions($rid, $options);
    /* создаем опции модификации */
    $modx->call('msopModificationOption', 'saveOptions',array(&$modx, $mid, $rid, $options));
    
    /* создаем модификацию */
    if((isset($old_price))&&($old_price!=NULL)){
        $modification = array(
          'rid' => $rid,
          'type' => 1,
          'price' => $price,
          'old_price' => $old_price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'active' => 1
        );
    }
    else{
         $modification = array(
          'rid' => $rid,
          'type' => 1,
          'price' => $price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'active' => 1
        );   
    }
    
    
    $response = $modx->runProcessor('modification/create', $modification, array(
      'processors_path' => MODX_CORE_PATH.'components/msoptionsprice/processors/mgr/'
    ));
    
    if ($response->isError()) {
В итоге в консоле пишет что цена должна быть уникальной…
Array
(
    [success] => 
    [message] => 
    [total] => 1
    [errors] => Array
        (
            [0] => Array
                (
                    [id] => price
                    [msg] => Это поле должно быть уникально
                )

        )

    [object] => Array
        (
        )

)
Да вообще все сломалось и не получается создать модификацию)
web3
15 сентября 2017, 06:17
1
0
А не подскажите, вот почти со всем разобрался, единственное, не могу обновить цвета и размеры у товаров, на сколько я понял, они хранятся не так как все остальные(вес, цена)?
На данный момент имею вот это.
<?php
if ($modx->event->name == 'mSyncOnProductOffers') {
$object=$xml->ХарактеристикиТовара;
$array = array();

foreach( $object as $element) {
foreach($element as $item){
$name=addslashes((string)$item->Наименование);
$value=addslashes((string)$item->Значение);
$array[$name] = $value;
}
}
$id=addslashes((int)$resource->id);
$array[id]=intval($id);
$modx->log(4,var_dump($array));

$data = $modx->getObject('msProduct', $array[id]);
if(isset($array[Обхват])){
$size=$array[Размер]."/".$array[Обхват];
$data->set('size',$size);
}
else{
$size=$array[Размер];
$data->set('size',$size);
}
if(isset($array[Цвет])){
$data->set('color',$array[Цвет]);
}
$data->set('weight', 500);
$data->save();
$vendor = $data->get('Vendor');

}
return;
Как сохранять и получать свойства типа цветов, размеров и подобных?
web3
14 сентября 2017, 13:46
1
0
Вот теперь чувствую себя контент менеджером… Спасибо!