К содержанию

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

Может быть кому-нибудь еще понадобится вывести все категории текущего товара. Делюсь.
<?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
6 849
Реклама

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

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

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

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

      Тогда предлагаю вот такой код:
      <?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
    Немного доработал и разместил тут.
      Виктор Долгий
      Виктор Долгий Проверенный
      01 июля 2013, 12:08
      Как всегда, огромное человеческое спасибо! :)
        Василий Наумкин
        Василий Наумкин Администратор
        01 июля 2013, 12:08
        Это тебе спасибо, мне то за что?
          Виктор Долгий
          Виктор Долгий Проверенный
          01 июля 2013, 12:20
          За поддержку, отзывчивость, разработки и данный ресурс в целом.
      Виктор Долгий
      Виктор Долгий Проверенный
      01 июля 2013, 20:49
      Проверил работу твоего скрипта, дублирует категории. У себя вылечил:
      $q->groupby('id');
      Ну, и разделитель можно поправить с " , " на ", ".
        Василий Наумкин
        Василий Наумкин Администратор
        01 июля 2013, 21:01
        Точно, потерялось где-то.

        Исправил!
        Dmytro Bochkov
        Dmytro Bochkov Старожил
        10 мая 2019, 12:25
        Добрый день Василий. А есть актуальная ссылка на данный сниппет? А то «и разместил тут» не работает(
          Василий Наумкин
          Василий Наумкин Администратор
          11 мая 2019, 05:53
          Вернул страничку. Нужно почистить кэш браузера, чтобы сбросить запомненный редирект.
        Серьёзный
        Серьёзный Старожил
        16 октября 2013, 18:18
        Ребята, что я делаю не так?

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

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

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

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

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

          Заранее благодарю за подсказку!
            Василий Наумкин
            Василий Наумкин Администратор
            20 декабря 2013, 20:51
            $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
              Огромное спасибо, работает!
            tracersani
            tracersani Старожил
            16 июля 2019, 12:19
            Не всегда удобно когда выводится просто 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