Вывод категорий товара тегами
        Может быть кому-нибудь еще понадобится вывести все категории текущего товара. Делюсь.
    
    
                                                                                
            <?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;    Комментарии: 20
                Это, скорее, аналог хлебных крошек, а не вывод всех категорий товара. Причем, этот аналог работает только для мультикатегорий, обычные категории он не покажет.
В общем, проясни, пожалуйста, зачем это нужно, в каких ситуация. Тогда немного поправим код и положим в готовые решения.
                    В общем, проясни, пожалуйста, зачем это нужно, в каких ситуация. Тогда немного поправим код и положим в готовые решения.
                Почему только для мультикатегорий? Показывает родительскую категорию и, если есть, дополнительные. Просто в силу специфики мне удобней было не тэгами разделять товары на отдельные группы, а категориями. Тэги я использовал для менее значимых праметров и группировок. Например, товар находится в нескольких основных группах, и, помимо этого есть еще несколько категорий по применению в разных секторах (бытовой, промышленный), чтобы удобней было пользоваться фильтром, не создавая большую кучу всего. Как по мне, в моем случае это добавляет удобства и понятности в категоризации.
            
                    
                Теперь понял. Из-за разделителя "/" решил, что сниппет должен показывать уровень вложения товара в категориях.
Тогда предлагаю вот такой код:
Выбирает все категории за один запрос и самостоятельно генерирует ссылки согласно настроек сайта. Работать будет немного быстрее.
                    Тогда предлагаю вот такой код:
<?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);Выбирает все категории за один запрос и самостоятельно генерирует ссылки согласно настроек сайта. Работать будет немного быстрее.
                Немного доработал и разместил тут.            
                    
                Как всегда, огромное человеческое спасибо! :)            
                    
                Это тебе спасибо, мне то за что?            
                    
                За поддержку, отзывчивость, разработки и данный ресурс в целом.            
                    
                На здоровье!            
                    
                Проверил работу твоего скрипта, дублирует категории. У себя вылечил:
                    $q->groupby('id');Ну, и разделитель можно поправить с " , " на ", ".            
                Точно, потерялось где-то.
Исправил!
                    Исправил!
                Добрый день Василий. А есть актуальная ссылка на данный сниппет? А то «и разместил тут» не работает(            
                    
                Вернул страничку. Нужно почистить кэш браузера, чтобы сбросить запомненный редирект.            
                    
                Ребята, что я делаю не так?
Создал сниппет, скопировал туда этот код.
Вызываю его [[$название_сниппета]] в чанке, чанк в шаблоне.
Пусто…
                    Создал сниппет, скопировал туда этот код.
Вызываю его [[$название_сниппета]] в чанке, чанк в шаблоне.
Пусто…
                Вызываю его [[$название_сниппета]] а надо [[! название_снипета]]            
                    
                Только без восклицательного знака — просто [[название_сниппета]]            
                    
                Тогда потом опять вопросы будут)            
                    
                Подскажите пожалуйста как вывести только альтернативные категории, и не выводить родителя.
Просто есть каталог одежды, и есть специальные коллекции. Каждый товар помимо категории, также привязывается к определенной коллекции.
Задача следующая — нужно в карточке товара сперва отобразить ссылку на категорию товара, т.е. вывести ссылку на родителя, и отдельной ссылкой вывести коллекцию, т.е. на альтернативную категорию.
Заранее благодарю за подсказку!
                    Просто есть каталог одежды, и есть специальные коллекции. Каждый товар помимо категории, также привязывается к определенной коллекции.
Задача следующая — нужно в карточке товара сперва отобразить ссылку на категорию товара, т.е. вывести ссылку на родителя, и отдельной ссылкой вывести коллекцию, т.е. на альтернативную категорию.
Заранее благодарю за подсказку!
$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;            
                Огромное спасибо, работает!            
                    
                Не всегда удобно когда выводится просто pagetitle, у меня например название идут 150 см, 120 см, и с точки зрения маркетинга не очень смотрится, 
по этому решение которое выводит в ссылку название из TV с проверкой заполненности.
                    по этому решение которое выводит в ссылку название из 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;            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.