Множественные категории для товаров

21 Апреля 2021 13:22

Как сделать, чтобы товару можно было присвоить категории и он выводился бы в этих категориях. Делать это будем по принципу создания ТВ поля с множественным выбором и поиску по значениям этой ТВ Id ресурса с помощью оператора LIKE.

Действия:

  1. Создаем ресурс, где всем скопом будут храниться товары (ну или так же разбить по категориям, чтобы был порядок в админке).
  2. Создем ресурс, где будет храниться дерево категорий;
  3. Создаем ТВ-поле типа "Множественный выбор" и в возможных значениях прописываем:
    @SELECT pagetitle,id FROM site_content WHERE template = 3 AND parent = 14 AND id <> 14

    где 3 - этой id шаблона категории, 14 - это ресурс, где лежит дерево категорий. Это позволит создать список заголовков для поля из категорий, но, при этом, хранить их id в виде 13||43||3456||2332

  4. Создаем сниппет с любым именем (например, 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 ТВ

  5. Далее в шаблоне Категории делаем стандартный вызов 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 попадет список ресурсов в ТВ поле которых указывается категория, в которой находится посетитель сайта