Используется для отрисовки иерархической структуры каталога, как правило для организации навигации по каталогу (дерева категорий или "хлебных крошек").
Структура любого каталога хранится в xml файле. В качестве примера можно взять файл catalog.xml из демонстрационного сайта. Файл содержит иерархию категорий, элементов и ярлыков (ссылок на элементы). Ярлыки при отрисовке автоматически преобразуются в элементы, поэтому в дальнейшем их можно не учитывать как самостоятельные логические элементы.
Общая структура файла с дизайнами (catalog_design.xml)
<?xml version="1.0" encoding="windows-1251" ?>
<control-document>
<catalogdesign id="main">
<header><![CDATA[Заголовок]]></header>
<delimiter><![CDATA[Разделитель]]></delimiter>
<item>
<level id="1000" number="1">
<usual><![CDATA[Обычная категория уровня 1]]></usual>
<active><![CDATA[Активная категория уровня 1 и вызов отрисовки следующего уровня (если нужно) через $Children$]]></active>
</level>
<level id="1010" number="2">
...
</level>
</item>
<footer><![CDATA[Подвал]]></footer>
<empty><![CDATA[Когда ничего не найдено]]></empty>
</catalogdesign>
</control-document>
Жирным выделены переменные части, определяемые разработчиком. Тэги CDATA могут отсутствовать, но мы рекомендуем ими обрамлять все блоки HTML для сохранения XML валидности файла с дизайнами.
Внимание: Данный макрос использует файл catalog_design.xml так же как и макрос CatalogFullTree, но в нем не может быть секции <entity ...> и нет разделения на category/element внутри <level ...>. По этой причине совместное использование этих макросов на одном проекте невозможно, а при переходе от использования одного макроса к другому или обратно следует помнить о необходимости добавления или удаления данного тэга.
Алгоритм работы макроса
При отрисовке данного макроса система проходит последовательно все категории из выбранного каталога. Для каждого пункта каталога из файла с дизайнами производится выбор секции catalogdesign с указанным в ключе design идентификатором. Далее, из секции <item> выделяется секция <level> с number равным уровню элемента в иерархии каталога. Корневой элемент имеет уровень 1, его подкатегории 2, элементы в них 3 и так далее.
Функционирование механизма определения уровня элементов полностью аналогично механизму определения уровня пункта в меню (см. макрос $Menu[]$), поэтому тут можно использовать переменную current (текущий уровень) и простейшие арифметические действия, а также интервалы. Таким образом, допустима конструкция <level number="1..current+2">, которая говорит что данная секция дизайна будет применена для всех категорий и элементов в каталоге, лежащих на уровне от 1 до "текущий уровень + 2". Под текущим уровнем понимается тот уровень, на котором сейчас находится пользователь в каталоге. Если он просматривает категорию третьего уровня, то current=3.
Все секции level в пределах файла catalog_design.xml должны иметь свои уникальные идентификаторы, которые могут быть произвольными строками в пределах допустимых значений для атрибутов тэгов в языке XML. Рекомендуется для простоты использовать символы A-Z, 0-9, "-" и "_", например <level id="uroven_2" number="2">
Внутри выбранной секции используется секция <active>, если категория находятся в ветке, в которой находится сейчас пользователь на сайте, или <usual> для всех остальных случаев. Это нужно для подсветки текущего пути при отрисовке навигации. Если активные пункты и неактивные отличаться по дизайну не должны, то значения этих секций должны быть одинаковы.
Папки, которые помечены в админзоне как неопубликованные в структуре не учитываются.
Если итоговый дизайн для текущего блока оказывается пустым, то на страницу будет выведена секция <empty>.
Вывод атрибутов
Каждый элемент дерева для отрисовки на сайте необходимо использовать в XML файле с дизайном. Каждый товар или папка, описанные некоторой сущностью в entities.xml, имеют набор полей (атрибутов). Каждое поле для текущего (при последовательном переборе во время отрисовки) элемента дерева может быть выведено в нужном месте дизайна через подстановку $PointProperty[атрибут]$.
Начиная с версии 4.37 $Attribute:атрибут$ в файле с дизайном может свободно применяться наравне с конструкцией $PointProperty[атрибут]$. В более ранних версиях $Attribute:атрибут$ не применялся или работал неправильно.
В файле catalog_design.xml можно использовать несколько служебных атрибутов, которые не находятся в таблицах с данными, а добавляются Cистемой "на лету".
- childcount - содержит количество элементов в текущей категории (только для категорий);
- folderchildcount - содержит количество папок в текущей категории (только для категорий);
- level - содержит номер уровня вложенности элемента в дереве;
- drillnumber - содержит сквозной номер (от 1 до N) папки в дереве;
- index - содержит порядковый номер папки на текущем уровне вложенности;
- pid - содержит идентификатор родительского элемента.
- table и entity содержат имя таблицы и идентификатор сущности для текущего элемента соответственно.
Комментарий:
до версии 5.13 атрибут index работал как drillnumber, но это вызывало затруднения разработчиков. Поэтому было принято решение унифицировать названия и теперь в рамках всей системы drillnumber обозначает сквозной номер в рамках всей выборки (в данном контексте - всего дерева), а index - просто порядковый номер, в данном контексте - на текущем уровне.