Записки велосипедиста №4. Бренды/производители товара.

Всем добрейшего времени суток.
Пару раз замечал, что люди не знают, как организовать систему брендов/стран-производителей для товара. Сегодня покажу самое простое и весьма полезное решение.

  • Шаг №1
    Создаём ресурс "производители" и для него несколько дочерних ресурсов, которые имеют названия брендов. Назначаем им шаблон "производители" (чуть ниже будет код, который в этот шаблон нужно вставить).

  • Шаг №2
    Создаём TV с именем brand, типом ввода "список ресурсов". В параметр "родители" указываем ID ресурса "производители", а параметр "включать родителей" устанавливаем на "нет". Далее, делаем TV доступным для шаблона "товар".

  • Шаг №3
    В шаблон "производители" вставляем код:
[[!getProducts?
                &fromParentList=`pagetitle`
                &includeTVs=`1`
                &includeTVList=`image,price`
                &tvFilters=`{"brand:LIKE":"[[*id]]"}`
                &tpl=`shk_product`
]]

Т.е. на страницу будут выводиться товары, у которых значение TV brand = ID этой самой страницы. &tvFilters={"brand:LIKE":"[[*id]]"}

  • Шаг №4
    В шаблон "товар" выводим название и ссылку на производителя.
[[*brand:isnot=``:then=`Производитель: <a href="[[~[[*brand]]]]">[[!pdoField?id=`[[*brand]]`&field=`pagetitle`]]</a>`]]

Итог: в карточке товара есть информация о производителе, на странице производителя есть все товары, которые относятся к нему.

Приветствую, что бы не плодить кучу тем, хотел бы описать слегка другой способ для товаров MIGX (подойдет и для ресурсов я думаю), но что бы и производителей (или что ещё понадобится) можно было использовать и для фильтрации.

  1. Создаём родителя "Производители" (например с ID(23))
  2. Создаем несколько дочерних документов (соответственно это сами производители)
  3. В MIGX в нашей конфигурации shop добавляем поле brand (инструкция как это сделать тыц)
  4. Для brand (которое мы создали выше) ставим Input TV type - listbox (Тип TV - выпадающий список с одиночным выбором)
  5. На вкладке Input Options в поле Input Options Value пишем следуещее
@SELECT pagetitle FROM modx_site_content WHERE parent=23

т.е. селектим все заголовки ресурсов, у которых родитель с ID = 23 (ID того родителя, который мы создали на шаге №1)

  1. Проверяем всё это дело на каком-нибудь товаре, прибиваем ему производителя, и заодно проверим всё это в TM2
  2. Создаём/редактируем шаблон "Каталог производителей", там где нужно выводить товары этого производителя, вызываем getProducts через getPage
[[!getPage?
    &cache=`1`
    &parents=`13,16,7,8`
    &elementClass=`modSnippet`
    &element=`getProducts`
    &className=`ShopContent`
    &packageName=`shop`
    &limit=`10`
    &tpl=`product_box`
    &where=`{"brand:LIKE":"[[*pagetitle]]"}`
    &pageFirstTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Первая</a></li> `
    &pageLastTpl=` <li class="control"><a [[+classes]] href="[[+href]]">Последняя</a></li> `
]]
<br class="clear" />
<ul class="pages">
    [[!+page.nav]]
</ul>
  1. Осталось теперь только что бы заработали ссылки, создаём микро-сниппет getUri
<?php
$document = $modx->getObject('modResource',array(
    'pagetitle' => $brandname,
    'parent'=> $parentid
));
$field = $document->get('uri');
return $field;

Т.е. просто получаем URI нашего производителя, что бы потом вставить в ссылку (параметр parentid нужен ,если вдруг вы где то ещё будет такой же pagetitle использовать)

  1. В карточке товара, ставим ссылку на страницу со всеми товарами производителя
<p class="some-p-class">Производитель: <a href="[[getUri? &brandname=`[[*brand]]` &parentid=`23`]]">[[*brand]]</a></p>

В итоге у нас можно фильтровать по этим производителям в каталоге и вывести все товары одного производителя в отдельном ресурсе.

Или можно не создавать сниппет и воспользоваться каким нибудь pdoResources или getResources (но по мне проще и быстрее будет сниппет):

p class="some-p-class">Производитель: <a href="[[~[[pdoResources? &parents=`23` &where=`{"pagetitle:LIKE":"[[*brand]]"}` &tpl=`@INLINE [[+id]]`]]]]</a></p>

Похоже, подключение к Форум | MODX Shopkeeper было разорвано, подождите, пока мы пытаемся восстановить соединение.