Как сделать, чтобы товару можно было присвоить категории и он выводился бы в этих категориях. Делать это будем по принципу создания ТВ поля с множественным выбором и поиску по значениям этой ТВ Id ресурса с помощью оператора LIKE.
Действия:
- Создаем ресурс, где всем скопом будут храниться товары (ну или так же разбить по категориям, чтобы был порядок в админке).
- Создем ресурс, где будет храниться дерево категорий;
- Создаем ТВ-поле типа "Множественный выбор" и в возможных значениях прописываем:
@SELECT pagetitle,id FROM site_content WHERE template = 3 AND parent = 14 AND id <> 14
где
3
- этойid
шаблона категории,14
- это ресурс, где лежит дерево категорий. Это позволит создать список заголовков для поля из категорий, но, при этом, хранить ихid
в виде13||43||3456||2332
-
Создаем сниппет с любым именем (например, findResources) со следующим содержимым:
<?php //id категории, которую ищем в значениях ТВшек $category = $modx->getOption('category', $scriptProperties, ''); //id ТВшки, в значениях которой ищем категорию $tmplvarid = $modx->getOption('tmplvarid', $scriptProperties, 44); if(!empty($category) && !empty($tmplvarid)) { $query = "SELECT contentid FROM { $modx->getTableName('modTemplateVarResource')} WHERE tmplvarid = $tmplvarid AND `value` LIKE '%$category%'"; $stmt = $modx->query($query); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); $output = array(); foreach($result as $k => $v) { $output[] = $v['contentid']; } $resources = implode(',', $output); return $resources; }
Сниппет возвращает список ресурсов, в значениях ТВ которых упоминается требуемый ресурс (категория).
Для него обязательно передать id категории при вызове и выставить по умолчанию id ТВ
-
Далее в шаблоне Категории делаем стандартный вызов pdoPage, но указываем parents -1 и resources с вызовом нашего сниппета. Пример
[[!pdoPage? &parents=`-1` &resources=`[[!findResources?&category=`[[-*id]]`]]` &tpl=`tpl` &includeTVs=`1` &includeTVList=`image,price` &processTVs=`1` &depth=`0` &limit=`12` &where=`{"template:=":4}` &elementClass=`modSnippet` &element=`fProducts` &pageVarKey=`page` &tplPageWrapper=`tplWrapper` ]]
Таким образом, в вызов pdoPage попадет список ресурсов в ТВ поле которых указывается категория, в которой находится посетитель сайта