Вывод категорий товара тегами
Может быть кому-нибудь еще понадобится вывести все категории текущего товара. Делюсь.
<?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;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.