Неправильная работа сниппета msProductOptions
На одном из сайтов глючит сниппет msProductOptions.
Через раз выводит значение опции не верно. Причем меняется при последовательном нажатии F5 в браузере. Сталкивались?
Вызов:
В чанке:
И да, такая ерунда для параметра width, тип — Числовое поле
Примеры вывода с ошибкой под катом.
Неправильный вывод (см. value):
Правильный вывод (см. value):
Через раз выводит значение опции не верно. Причем меняется при последовательном нажатии 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] =>
)
Комментарии: 7
Здравствуйте, у меня та же ситуация, в чем же проблема?
Хм… не очень помню, чем закончилось… кажется я переписывал сниппет msProductOptions
Я вносил потом правки в код msProductOptions (не связанные с проблемой).
Сравнивая код сейчас, вижу, что пожалуй, есть только одно изменение…
Я добавил это:
Я вносил потом правки в код msProductOptions (не связанные с проблемой).
Сравнивая код сейчас, вижу, что пожалуй, есть только одно изменение…
Я добавил это:
if(is_array($option['value']) && count($option['value']) == 1 && empty($option['value'][0])) {
continue;
}
перед этой строчкой:$options[$key] = $optionLinked;
была ли в этом загвоздка — даже и не знаю…
Не помогло, та же дичь…
Но спасибо)
Но спасибо)
Привет! Может быть есть еще варианты? Так и не решить проблема, не пойму, что не так.
Особо нечего добавить, не помню, что сделал)))
Изменения в сниппете я описал, больше там точно ничего нет…
Где еще что я делал — не помню, давно было!
Изменения в сниппете я описал, больше там точно ничего нет…
Где еще что я делал — не помню, давно было!
Была проблема с выводом опций в листинге товаров. Они через раз грузились. Набросал свой сниппет:
Знаю, что html в сниппеты – не кошерно. Тогда не знал)
Можете под себя поднастроить.
<?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 в сниппеты – не кошерно. Тогда не знал)
Можете под себя поднастроить.
Я использовал вывод опций через 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}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.