Вывод категорий товара тегами

Может быть кому-нибудь еще понадобится вывести все категории текущего товара. Делюсь.
<?php

$currentID = $modx->resource->get('id');
$parentID = $modx->resource->get('parent');

$q = $modx->newQuery('msCategory');
$q->rightJoin('msCategoryMember', 'msCategoryMember', 'msCategory.id=msCategoryMember.category_id');
$q->groupby('msCategory.id');
$q->sortby('msCategory.pagetitle','ASC');
$q->select('msCategory.id, msCategory.pagetitle');
$q->where('msCategoryMember.product_id='.$currentID);

$parent = $modx->getObject('modResource', $parentID);
$parentTitle = $parent->get('pagetitle');
$options = "<a href=\"[[~$parentID]]\">$parentTitle</a>";

if ($q->prepare() && $q->stmt->execute()) {
	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
		$options .= " / <a href=\"[[~$row[id]]]\">$row[pagetitle]</a>";
	}
}

return $options;
Виктор Долгий
30 июня 2013, 20:37
modx.pro
5
5 811
0

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

Василий Наумкин
01 июля 2013, 06:39
0
Это, скорее, аналог хлебных крошек, а не вывод всех категорий товара. Причем, этот аналог работает только для мультикатегорий, обычные категории он не покажет.

В общем, проясни, пожалуйста, зачем это нужно, в каких ситуация. Тогда немного поправим код и положим в готовые решения.
    Виктор Долгий
    01 июля 2013, 10:55
    0
    Почему только для мультикатегорий? Показывает родительскую категорию и, если есть, дополнительные. Просто в силу специфики мне удобней было не тэгами разделять товары на отдельные группы, а категориями. Тэги я использовал для менее значимых праметров и группировок. Например, товар находится в нескольких основных группах, и, помимо этого есть еще несколько категорий по применению в разных секторах (бытовой, промышленный), чтобы удобней было пользоваться фильтром, не создавая большую кучу всего. Как по мне, в моем случае это добавляет удобства и понятности в категоризации.

      Василий Наумкин
      01 июля 2013, 11:49
      1
      0
      Теперь понял. Из-за разделителя "/" решил, что сниппет должен показывать уровень вложения товара в категориях.

      Тогда предлагаю вот такой код:
      <?php
      $currentID = $modx->resource->id;
      $parentID = $modx->resource->parent;
      $delimeter = ' , ';
      $scheme = $modx->getOption('link_tag_scheme');
      
      $q = $modx->newQuery('msCategory');
      $q->leftJoin('msCategoryMember', 'msCategoryMember', array(
      	'`msCategory`.`id` = `msCategoryMember`.`category_id`'
      ));
      $q->sortby('pagetitle','ASC');
      $q->select(array('id','pagetitle'));
      $q->where('`msCategoryMember`.`product_id` = '.$currentID.' OR `id` = '.$parentID);
      
      $result = array();
      if ($q->prepare() && $q->stmt->execute()) {
      	while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
      		$url = $modx->makeUrl($row['id'], '', '', $scheme);
      		$result[] = '<a href="'.$url.'">'.$row['pagetitle'].'</a>';
      	}
      }
      
      return implode($delimeter, $result);

      Выбирает все категории за один запрос и самостоятельно генерирует ссылки согласно настроек сайта. Работать будет немного быстрее.
    Василий Наумкин
    01 июля 2013, 12:01
    0
    Немного доработал и разместил тут.
      Виктор Долгий
      01 июля 2013, 12:08
      0
      Как всегда, огромное человеческое спасибо! :)
      Виктор Долгий
      01 июля 2013, 20:49
      0
      Проверил работу твоего скрипта, дублирует категории. У себя вылечил:
      $q->groupby('id');
      Ну, и разделитель можно поправить с " , " на ", ".
      Dmytro Bochkov
      10 мая 2019, 12:25
      0
      Добрый день Василий. А есть актуальная ссылка на данный сниппет? А то «и разместил тут» не работает(
        Василий Наумкин
        11 мая 2019, 05:53
        0
        Вернул страничку. Нужно почистить кэш браузера, чтобы сбросить запомненный редирект.
      Серьёзный
      16 октября 2013, 18:18
      0
      Ребята, что я делаю не так?

      Создал сниппет, скопировал туда этот код.

      Вызываю его [[$название_сниппета]] в чанке, чанк в шаблоне.

      Пусто…
        Александр Котлов
        16 октября 2013, 18:51
        0
        Вызываю его [[$название_сниппета]] а надо [[! название_снипета]]
          Илья Уткин
          16 октября 2013, 20:46
          0
          Только без восклицательного знака — просто [[название_сниппета]]
      Юрий
      20 декабря 2013, 19:10
      0
      Подскажите пожалуйста как вывести только альтернативные категории, и не выводить родителя.

      Просто есть каталог одежды, и есть специальные коллекции. Каждый товар помимо категории, также привязывается к определенной коллекции.

      Задача следующая — нужно в карточке товара сперва отобразить ссылку на категорию товара, т.е. вывести ссылку на родителя, и отдельной ссылкой вывести коллекцию, т.е. на альтернативную категорию.

      Заранее благодарю за подсказку!
        Василий Наумкин
        20 декабря 2013, 20:51
        2
        0
        $id = $modx->resource->id;
        $tpl = '@INLINE <a href="[[~[[+id]]]]">[[+pagetitle]]</a>';
        $pdo = $modx->getService('pdoFetch');
        
        $options = array(
        	'innerJoin' => array(
        		'msCategory' => array('on' => 'msCategoryMember.category_id = msCategory.id')
        	),
        	'select' => array('msCategory' => 'all'),
        	'sortby' => 'msCategory.id'
        );
        $conditions = array('product_id' => $id);
        $rows = $pdo->getCollection('msCategoryMember', $conditions, $options);
        
        $output = '';
        foreach ($rows as $row) {
        	$output .= $pdo->getChunk($tpl, $row);
        }
        
        return $output;
          Юрий
          21 декабря 2013, 14:01
          0
          Огромное спасибо, работает!
        tracersani
        16 июля 2019, 12:19
        0
        Не всегда удобно когда выводится просто pagetitle, у меня например название идут 150 см, 120 см, и с точки зрения маркетинга не очень смотрится,

        по этому решение которое выводит в ссылку название из TV с проверкой заполненности.

        <?php
        if (empty($id)) {$id = $modx->resource->id;}
        if (empty($tpl)) {$tpl = '@INLINE <a href="{$_modx->makeUrl($id)}" class="tag">{$TV_NAME ?: $pagetitle}</a>';}
        $pdo = $modx->getService('pdoFetch');
        
        $conditions = array('product_id' => $id);
        $options = array(
        	'innerJoin' => array(
        		'msCategory' => array('on' => 'msCategoryMember.category_id = msCategory.id'),
        	),
        	'leftJoin' => array(
        		'tvtitle' => array(
        			'class' => 'modTemplateVarResource', 
        			'on' => 'tvtitle.contentid = msCategoryMember.category_id AND tvtitle.tmplvarid = 6'
        		),
        	),
        	'select' => array(
        		'msCategory' => 'all',
        		'tvtitle' => 'IFNULL(tvtitle.value, "") AS TV_NAME',
        	),
        	'groupby' => 'msCategory.id',
        	'sortby' => 'msCategory.id',
        );
        $rows = $pdo->getCollection('msCategoryMember', $conditions, $options);
        
        $output = '';
        foreach ($rows as $row) {
        	$output .= $pdo->getChunk($tpl, $row);
        }
        
        return $output;
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          20