Подстановка используется для отрисовки списков товаров в заданной категории.
Идеологически каталоги элементов (товаров, услуг и т.п.) устроены следующим образом:
Структура каталога
Хранится в XML файле. Она включает в себя категории (в админзоне выглядят как папки, в xml файле представлены как элементы folder с атрибутом assign="catalog_folder"), элементы (в админзоне отрисованы как страницы, в xml представлены элементами <node> c атрибутом assign="catalog_node") и ярлыки (ссылки на элементы). Ярлыки в админзоне рисуются как "страницы со стрелочками", а в xml они создаются и используются без участия разработчика.
Сущности для элементов
В рамках одного каталога могут присутствовать элементы разного типа. Например, в каталоге могут быть представлены фотоаппараты с ценой, описанием и картинкой, и фотопленки с количеством кадров и ценой. Сущности для фотоаппаратов и фотопленок задаются в entities.xml стандартным образом, при этом нужно добавлять к сущности (тэгу entity) атрибут assign="catalog".
Данные
Данные хранятся в таблицах в папке Data, при этом можно хранить все товары в одной таблице (даже с разными сущностями), или разнести товары разного типа в разные таблицы.
Привязка сущностей и таблиц к каталогу
Сущность и таблица, в которой хранятся экземпляры сущности (сами товарные записи), задаются через атрибуты entity и table тэга <folder> для категорий в каталоге. Можно задавать эти атрибуты и всему каталогу целиком, прописав их в тэге folder с assign="catalog".
В дальнейшем при работе с каталогом в админзоне при создании новых категорий, в случае если каталог содержит более одного варианта товара (то есть в entities.xml есть более одного элемента с assign="catalog") система будет запрашивать какую сущность присвоить создаваемой категории. Это будет означать, что все элементы внутри будут иметь указанную сущность и храниться в указанной таблице.
Если сущность для элемента-плёнки называется film, то можно задать сущность film_container для категории, чтобы иметь возможность задавать и позже отрисовывать описания не только для товаров, но для категорий (товарных групп). Прописывать сущность film_container нигде не нужно, она будет привлечена системой для категорий с entity="film" автоматически.
Использование
Задавая различные ключи разработчик указывает элементы из какой категории он хочет вывести на странице. Система автоматически определит таблицу где хранится информация об элементах и сущность, к которой они относятся. Затем из файла catalog_items_design.xml будет извлечена секция <entity> с id, который должен содержать указанный идентификатор сущности. В атрибуте id секции <entity> может содержаться несколько идентификаторов через запятую.
В секции <entity> может содержаться несколько дизайнов для разных случаев отображения, это тэги catalogitemdesign. Система выберет нужный дизайн, идентификатор которого был передан в макроподстановку (ключ design). В дальнейшем работа макроса будет полностью аналогична логике работы макроса $News[]$, то есть из секций <header>, <footer>, <item> и <delimiter> будет составлена лента элементов (товаров), которая и будет отрисована. Если описание будет пустым выводится секция <empty>.
Фильтруя список по определенному id товара можно отрисовывать описание одного выбранного товара (или использовать фильтрацию с выбором диапазона - см. описание ключа filter для макроса $News[]$).
Примеры файлов catalog.xml, entities.xml, catalog_items_design.xml можно найти в демо-магазине.
Служебные атрибуты
В дизайне вывода данных помимо полей, определенных для сущности в entities.xml разработчиком, возможно использовать служебные поля.
- drillnumber - сквозной номер элемента или папки в пределах дерева;
- index - порядковый номер элемента или папки в текущей папке;
- isFirst - индикатор первой записи в выборке. Возвращает 1 если запись первая или пустую строку, если это не так;
- isLast - индикатор последней записи в выборке. Возвращает 1 если запись последняя или пустую строку, если это не так.
- pid - parentid, идентификатор родительской папки;
- soul - id элемента, от которого изначально был образован "ярлык" в дереве. Существует только для ярлыков;
- totalcount - количество товаров в данной категории, без учета постраничной разбивки (введен с версии 4.46).
Пример №1
$CatalogList[source: catalog; catalogid: maincatalog; design: catalog_itemlist; items_per_page: 10; sort: date, desc, auto]$
Отрисует элементы из каталога с идентификатором maincatalog из файла catalog.xml, разбивая список на страницы по 10 элементов и сортируя их по полю date в нисходящем порядке.
Пример №2
$CatalogList[source: catalog; catalogid: maincatalog; design: catalog_itemlist; filter:id=$IN_nid$]$
Отрисует элемент c id равным параметру nid, переданному в URL, из каталога с идентификатором maincatalog из файла catalog.xml.