как вывести список категорий в которые включен товар в minishop2 в виде ссылок

как вывести список категорий в которые включен товар в minishop2 в виде ссылок на странице самого товара?
Евгений
17 августа 2020, 12:22
modx.pro
2
807
0

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

Павел Романов
17 августа 2020, 14:33
+1
Сделайте сниппет getCategories:
<?php
$modx->getService('miniShop2');
$docid = $modx->getOption('docid', $scriptProperties, $modx->resource->get('id'));
$sql = "SELECT * FROM {$modx->getTableName('msCategoryMember')} WHERE `product_id` = $docid";
$q = $modx->prepare($sql);
$q->execute();
$resources = $q->fetchAll(PDO::FETCH_ASSOC);
foreach ($resources as $resource){
    $cat = $modx->getObject('modResource', $resource['category_id'])->toArray(); 
    $out .= $modx->getChunk($tpl,$cat);
}
return $out;

Вызывайте на странице товара
[[getCategories? 
&tpl=`cat_tpl`
]]

В чанках:
[[getCategories? 
&tpl=`cat_tpl` 
&docid=`[[+id]]`
]]

В чанке cat_tpl доступны все поля ресурса например:
<a href="[[+uri]]">[[+pagetitle]]</a>
    Евгений
    17 августа 2020, 19:45
    0
    а как в таком случае сделать две разных выборки по категориям из двух разных разделов (родителей)? при вызове сниппета getCatefories указать parents сработает?
      Павел Романов
      17 августа 2020, 19:57
      +1
      Этот сниппет собирает все категории товара, которые у него отмечены на соответствующей вкладке.
      Если нужно выводить их по родителям, то можете в нем собирать только ID-шники категорий:
      <?php
      $modx->getService('miniShop2');
      $docid = $modx->getOption('docid', $scriptProperties, $modx->resource->get('id'));
      $sql = "SELECT * FROM {$modx->getTableName('msCategoryMember')} WHERE `product_id` = $docid";
      $q = $modx->prepare($sql);
      $q->execute();
      $resources = $q->fetchAll(PDO::FETCH_ASSOC);
      foreach ($resources as $resource){
          $cats[] = $resource['id'];
      }
      $out = implode(',', $cats);
      return $out;

      И его вызов подставлять уже в pdoResources:
      [[pdoResources?
      &parents=`123` // нужный родитель
      &resources=`[[getCategories:default=`9999999`]]`
      &tpl=`cat_tpl`
      .........
      ]]
        Павел Романов
        17 августа 2020, 20:17
        +1
        Поправочка:
        ...
            $cats[] = $resource['category_id']; // тут category_id, а не id
        ...
      Uladzislau
      07 апреля 2022, 18:49
      0
      А как с помощью этого сниппета добавить еще разделитель, если товар находится в двух категориях? скрипт работает, но если несколько, лепит все в одну
        Павел Романов
        07 апреля 2022, 18:58
        0
        Каждая категория — отдельный элемент и выводится чанком, указанным в &tpl.
        Оформите его как угодно.
          Uladzislau
          07 апреля 2022, 19:23
          0
          Точнее во втором вариантом implode(', ', $cats) не хочет разделять лепит через проблем. а надо через запятую. Подскажите пожалуйста, где можно указать правильно сепаратор через ", ".
          Такой вариант не работает (((
          [[pdoResources? &parents=`10` &resources=`[[getCategories:default=`9999999`]]` &tpl=`cat_tpl` &tvFiltersAndDelimiter = `, `]]
          Выводит вот так:

          Категория: Решения SIEM Антивирусы

          А должно быть вот так

          Категория: Решения SIEM, Антивирусы
            Павел Романов
            07 апреля 2022, 19:29
            0
            Добавьте в вызов pdoResources параметр &outputSeparator=`, `
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8