Иногда при создании каталога на MODX требуется сделать возможность выводить один и тот же ресурс в разных категориях. Сделать это совсем не сложно, т.к. мы знаем, что MODX это очень гибкая система. Расскажу как это сделать на MODX Revolution, но в Evo этот принцип тоже применим.
Создаём дополнительное поле (TV).
Имя: categories
Заголовок: Категории
Параметры ввода:
Тип ввода: Флажки(checkbox) или Список (множественный выбор)
В поле "Возможные значения" вводим такой код:
@EVAL return $modx->runSnippet('getResources',array('parents'=>63,'depth'=>5,'limit'=>0,'where'=>'{"template:=":5}','sortby'=>'{"id":"ASC"}','tpl'=>'@INLINE [ [#[ [+parent]].pagetitle]] > [ [+pagetitle]]==:[ [+id]]:','outputSeparator'=>'||'));
Тут мы используем сниппет getResources чтобы получить список названий и ID категорий. В данном случае ID каталога (документа, в который вложены категории) - 10, уровень вложености - 3.
Присваиваем это дополнительное поле шаблону ресурса.
Теперь для ресурса мы можем выбрать дополнительные категории.
Осталось вывести ресурсы из этих категорий. Для этого нам понадобится всё тот же getResources (+ getPage) и дополнительный небольшой сниппет.
Я назвал этот сниппет getIDLikeByTV. Вот его код:
/*[ [getIDLikeByTV?tmplvarid=`6`&like=`:[ [*id]]:`]]*/
if(!isset($tmplvarid)) $tmplvarid = 1;
if(!isset($like)) $like = '';
$ids_arr = array();
$query = $modx->newQuery('modTemplateVarResource');
$query->select($modx->getSelectColumns('modTemplateVarResource','modTemplateVarResource','',array('id','contentid'
)));
$query->where(array(
'tmplvarid' => intval($tmplvarid),
'value:LIKE' => '%'.$like.'%'
));
$query->sortby('contentid','ASC');
$results = $modx->getCollection('modTemplateVarResource',$query);
if($results){
foreach ($results as $result) {
array_push($ids_arr,$result->get('contentid'));
}
}
return implode(',',$ids_arr);
Сниппет ищет подстроку (параметр &like) в значениях дополнительных полей с определённым ID (параметр &tmplvarid). Теперь выводим ресурсы:
[ [!getPage?
&elementClass=`modSnippet`
&element=`getResources`
$depth=`1`
&hideContainers=`1`
&resources=`[ [getIDLikeByTV?tmplvarid=`6`&like=`:32:`]]`
&tplPath=`[ [++core_path]]components/shopkeeper/elements/chunks/ru/`
&tpl=`@FILE product1.tpl`
&includeTVs=`1`
&includeTVList=`image,price`
&processTVs=`0`
&limit=`10`
&sortby=`{"pagetitle":"ASC"}`
&pageVarKey=`page`
&pageFirstTpl=`< li class="control">< a [ [+classes]] href="[ [+href]]">Первая`
&pageLastTpl=`< li class="control">< a [ [+classes]] href="[ [+href]]">Последняя`
]]
< div class="clear">< /div>
< ul class="pages">
[ [!+page.nav]]
< /ul>
Но потом как всегда проходит время и появилось более изящное решение, которое без сниппетов, но к сожалению нигде ранее не описано (как получить данные ресурса по галочке в админке).