Павел Романов

Павел Романов

Был в сети 30 июля 2026, 15:23
Заказы принимаю
Проверьте вывод [[*TovarRelated]] на странице статьи — там pagetitle товаров выводятся слитно, а не через разделитель ||, который Вы используете в getMyResources на пятой строке.
Укажите у этой TV тип вывода «Разделитель», поставьте в качестве него запятую и используйте ее в explode.

Но вообще все можно упростить. Сниппет getrel:
<?php
$titles = explode(',', $input);
$ids = array();
foreach($titles as $title){
    if(!$prod = $modx->getObject('modResource', array('pagetitle' => $title))) continue;
    $ids[] = $prod->get('id');
}
count($ids) > 0 ? $out = implode(',', $ids) : $out = 9999999;
return $out;

Вызов в шаблоне статьи:

[[msProducts?
&tpl=`gridProductTpl`
&limit=`4`
&parents=`10`
&resources=`[[*TovarRelated:getrel]]`
]]
Если эти значения используются только для вывода на странице товара или в чанках, достаточно просто указать ID нужных ресурсов-цветов через || (если нет настроенного разделителя):
12||13||14||15
Если разделитель указан, то через него.

В случае фильтрации или каких-либо выводов ресурсов с учетом значения данного параметра, надо не указывать значения по умолчанию, а всё писать в базу. Для этого создайте плагин на событие onDocFormSave, где пишите нужные данные через ||:
<?php
if(!$template = $resource->get('template')) return; 
if($modx->event->name == 'onDocFormSave' && $mode == 'new' && $template  == 5) {  // Вместо 5 укажите ID шаблона товара
    $resource->setTVValue('colors', '12||13||14||15');
}
Создайте плагин, в котором получайте значение TV и удаляйте директорию.
Если на удаление ресурса, то повесьте плагин на событие OnDocFormDelete, если на очистку корзины, то на OnBeforeEmptyTrash.

В первом случае есть объект ресурса и значение его TV можно получить через:
$resource->getTVValue('tvname');

Во втором — есть массив ID удаляемых ресурсов, которые можно использовать для получения объектов и дальше как в первом варианте.
Если написано «плагин», значит надо создать именно плагин ).
Вот рабочий:
<?php
if($modx->event->name == 'xLikeOnVote'){
    $tvid = 5; //тут вместо 5 - ID TV "like" 
    $tvo = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvid, 'contentid' => $parent
    ));
    if($tvo){
        $tvo->set('value', $rating);
    }else{
        $tvo = $modx->newObject('modTemplateVarResource', array(
            'tmplvarid' => $tvid,
            'contentid' => $parent,
            'value' => $rating
        ));
    }
    $tvo->save();
}

Обратите внимание на комментарий на третьей строке — там нужно поставить ID Вашей TV.
Ну и на вкладке «Системные события» не забудьте отметить флажок xLikeOnVote