Неправильная работа сниппета msProductOptions

На одном из сайтов глючит сниппет msProductOptions.

Через раз выводит значение опции не верно. Причем меняется при последовательном нажатии F5 в браузере. Сталкивались?

Вызов:
{$_modx->runSnippet('!msProductOptions', [ 'tpl' => 'product.Options' ])}

В чанке:
{$option | print}

И да, такая ерунда для параметра width, тип — Числовое поле

Примеры вывода с ошибкой под катом.

Неправильный вывод (см. value):
Array
(
    [id] => 14
    [caption] => Ширина, мм
    [description] => 
    [measure_unit] => 
    [category] => 0
    [type] => numberfield
    [properties] => 
    [product_id] => 334
    [key] => width
    [value] => Array
        (
            [0] => width
            [1] => 
            [2] => default
            [3] => 
            [4] => checkbox
        )

    [category_name] => 
)

Правильный вывод (см. value):
Array
(
    [id] => 14
    [caption] => Ширина, мм
    [description] => 
    [measure_unit] => 
    [category] => 0
    [type] => numberfield
    [properties] => 
    [product_id] => 334
    [key] => width
    [value] => Array
        (
            [0] => 20 мм
        )

    [category_name] => 
)
Наумов Алексей
18 мая 2018, 12:25
modx.pro
1
1 654
0

Комментарии: 7

nekto
31 октября 2018, 11:38
0
Здравствуйте, у меня та же ситуация, в чем же проблема?
    Наумов Алексей
    31 октября 2018, 15:15
    0
    Хм… не очень помню, чем закончилось… кажется я переписывал сниппет msProductOptions

    Я вносил потом правки в код msProductOptions (не связанные с проблемой).
    Сравнивая код сейчас, вижу, что пожалуй, есть только одно изменение…
    Я добавил это:
    if(is_array($option['value']) && count($option['value']) == 1 && empty($option['value'][0])) {
            continue;
        }
    перед этой строчкой:
    $options[$key] = $optionLinked;
    была ли в этом загвоздка — даже и не знаю…
      nekto
      31 октября 2018, 23:35
      0
      Не помогло, та же дичь…
      Но спасибо)
        nekto
        27 ноября 2018, 12:36
        0
        Привет! Может быть есть еще варианты? Так и не решить проблема, не пойму, что не так.
          Наумов Алексей
          27 ноября 2018, 14:15
          0
          Особо нечего добавить, не помню, что сделал)))
          Изменения в сниппете я описал, больше там точно ничего нет…

          Где еще что я делал — не помню, давно было!
            Дмитрий
            27 ноября 2018, 18:21
            0
            Была проблема с выводом опций в листинге товаров. Они через раз грузились. Набросал свой сниппет:

            <?php
            $options = $modx->resource->getTVvalue('categoryTplOpitions');
            if (!$options && $source) {
              $parent = $modx->getObject('modResource',$source);
              $options = $parent->getTVValue('categoryTplOpitions');
            }
            if(!$product || !$options) {
              return;
            }
            $result = '<ul class="category-product-main-list w-list-unstyled">';
            $options_arr = explode(',',$options);
            if(($key = array_search('vendor',$options_arr)) !== false){
              unset($options_arr[$key]);
              if ($data = $modx->getObject('msProductData', $product)) {
                $productObj = $data->getOne('Product');
                $vendor = $productObj->getOne('Vendor');
                if ($vendor) {
                  $result .= '<li class="category-product-main-li">Производитель: <span class="category-product-mail-li-span">'.$vendor->get('name').'</span></li>';
                }
              }
            }
            $options_str = '"'.implode('","',$options_arr).'"';
            if (implode('","',$options_arr)) {
              $query = $modx->newQuery('msProductOption');
              $query->leftJoin('msOption','msOption',array("msOption.key = msProductOption.key"));
              $query->select(array(
                'msProductOption.key as option_key',
                'msProductOption.value as value',
                'msProductOption.product_id as product_id',
                'msOption.id as option_id',
                'msOption.caption as caption',
                'msOption.description as description',
                'msOption.measure_unit as measure_unit'
              ));
              $query->where(array(
                'product_id'=>$product,
                'msProductOption.key:IN' => $options_arr,
              ));
              $query->sortby('FIELD(option_key,'.$options_str.')');
              $items = $modx->getCollection('msProductOption',$query);
              $arr=[];
              
              foreach ($items as $item) {
                $caption = $item->get('description');
                if (!$caption) {
                  $caption = $item->get('caption');
                }
                if (array_key_exists ($caption , $arr )) {
                  $key = $arr[$caption];
                  $key .= ', '.$item->get('value');
                  $arr[$caption]=$key;
                } else {
                  if ($item->get('measure_unit')) {
                    $arr[$caption]=$item->get('value').' '.$item->get('measure_unit');
                  } else {
                  $arr[$caption]=$item->get('value');
                  }
                }
              }
              foreach ($arr as $key=>$value) {
                $result .= '<li class="category-product-main-li">'.$key.': <span class="category-product-mail-li-span">'.$value.'</span></li>';
              }
            }
            $result .='</ul>';
            return $result;
            И в чанке товара соответственно:

            {$_modx->runSnippet('!productOptions',[
                'product' => $id
                'source' => $_modx->resource.categorySource
              ])}
            $_modx->resource.categorySource
            – это id категории, откуда опции подтягиваем. В этом проекте так надо было.

            Знаю, что html в сниппеты – не кошерно. Тогда не знал)

            Можете под себя поднастроить.
      Вячеслав Варов
      03 ноября 2019, 10:33
      0
      Я использовал вывод опций через pdoResources, и это сработало
      [[!pdoResources?
                          &tpl=`tpl.productOptions`
                          &parents=`[[*parent]]`
                          &class=`msProduct`
                          &leftJoin=`{
                              "Options": {
                                  "class": "msProductOption",
                                  "on": "msProduct.id = Options.product_id"
                              },
                              "captionOption": {
                                  "class": "msOption",
                                  "on": "Options.key = captionOption.key"
                              }
                          }`
                          &select=`{
                              "Options": "key,value",
                              "captionOption":"caption,measure_unit"
                          }`
                          &where=`["msProduct.id = [[*id]]"]`
                      ]]
      а в чанке вывода используем переменные {$key} {$value} {$caption} {$measure_unit}
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7