msProductOption перестает возвращать опции если товар "виртуально" добавить в еще одну категорию.

Есть товар. Есть несколько опций созданных в настройках minishop и привязанных к категории, в которой товар. Заполнили опции значениями. Сохранили товар. На странице опции выводятся совсем уж просто

{'!msProductOptions'|snippet:[
'tpl'=>'@FILE tpl/optionsList.tpl'
]}

Они роскошно выводятся. Но тут менеджер берет и ставит на вкладке — Категории у этого товара галочку для привязки его к другой категории. Товар продолжает отображаться как был, все ок — но больше ни одного значения характеристики нет.
Сначала решили что это потому, что у категории, куда мы его виртуально поместили не привязаны эти же опции. привязали. Снова ничего. Страница товара открывается, товар физически лежит в той категории где и нужно, но опций нет (имеется ввиду не выводятся сниппетом, в админке то они есть и заполнены.)
Убираем галочки, снимаем привязку к другой категории и вуаля — сразу на странице вывелись все опции.
Открыл код msProductOption
в нем есть строки
/** @var msProductData $data */
if ($data = $product->getOne('Data')) {
    $optionKeys = $data->getOptionKeys();
}
if (empty($optionKeys)) {
    return 'hello world';
}
Так вот если товар расположен только в одной категории то $optionKeys не пусто и сниппет возвращает опции. Стоит просто добавить галочку и разместить его в другую категорию, я сразу получаю «hello world»
Есть идеи?
Александр Мельник
27 февраля 2020, 21:45
modx.pro
249
0

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

Александр Мельник
28 февраля 2020, 10:54
0
Почему такое происходит со стандартным сниппетом msProductOption не разобрался.
Написал свой.
Может кто-то столкнется с такой же проблемой и найдет по поиску эту статью (хотя уж простите Василий, но поиск на этом сайте работает ужасно, хотя гугл хорошо все индексирует и компенсирует этот момент) — то приведу свой код здесь.
Сниппет получения опций
<?php
$product = $modx->getObject('msProduct', array('id' => $modx->resource->id));
$productData = $product->loadOptions();
$options=[];
$optionsName=[];
foreach ($productData as $k=>$v) {
    if (is_array($v)){
        $optionsName[]=$k;
    }
}
foreach($optionsName as $name){
    $options[$productData[$name.'.caption']]=$productData[$name.'.value'];
}
$pdoTools = $modx->getService('pdoTools');
return $pdoTools->getChunk($tpl, array(
    'options' => $options,
));
Вызов на странице
{'@FILE snippet/optionList.php'|snippet:[
                                'tpl'=>'@FILE tpl/optionsList.tpl',
                                ]}
Используемый чанк для вывода
{foreach $options as $name => $value}
{if $value?}
    <div class="config">
        <div class="config__title">{$name}</div>
        <div class="config__col">{$value}</div>
    </div>
{/if}
{/foreach}
По крайней мере в таком виде опции отображаются всегда и не пропадают, даже если товар размещен виртуально в другие категории.
    Александр Мельник
    28 февраля 2020, 11:38
    0
    Кстати есть вопрос по поводу кеширования. Чисто ради саморазвития, если кто в курсе и не лень — подскажите.
    Вот тут
    docs.modx.pro/komponentyi/pdotools/fajlovyie-elementyi
    написано
    Файловые сниппеты не кэшируются,
    а я столкнулся со следующим.
    Вношу изменения в код php файла, сохраняю и ничего при обновлении страницы где вызывается этот файловый сниппет не меняется. Сбрасываю кеш в админке — никаких изменений. Только физическое очищение папки core/cache позволяет увидеть изменения. Почему так, если написано что файловые сниппеты не кешируются. Но если вносить изменения в tpl -ку которая используется для вывода то тут любые изменения сразу видны на странице.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      2