В Импере в папке внешних модулей (это папка design/common_parts) есть удобный модуль AIMatrix Categories (это файл design/common_parts/AIMatrix/categories.htm). С помощью него можно реализовать Вашу задачу. В нужные места шаблона подключаете этот модуль необходимое количество раз, то есть по разу для 3 предполагаемых блоков категорий. В каждом подключении даете желаемый набор параметров.
Вариант 1. Вывод блоков категорий по именам веток.
Предположим каталог товаров сайта содержит 10 категорий верхнего уровня (веток), разумеется внутри каждой есть свои подкатегории, глубина вложения может быть любой и нам сейчас не интересна. Теперь представим, нас просят вывести на страницу сайта в три отдельных блока (div-контейнера) три ветки каталога: например Видеокарты, Материнские платы → Asus и Принтеры. Причем каждый блок просят вывести в виде UL-списка с глубиной вложенности не далее 4 подкатегорий. Привожу ниже три вызова упомянутого модуля, в каждом случае применяются свои параметры вызова, их отличия выделены синим цветом, серым выделены неизменившиеся параметры.
{* ---------- выводим блок 1 ---------- *}
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $categories|default:false
filter = ''
namepath = 'Видеокарты'
maxlevel = 4
opentag = '<div class="categories-box">'
box_opentag = '<h2> Это блок 1 </h2>'
listing_opentag = '<ul>'
link_opentag = '<li>'
a_id = ''
a_class = ''
a_active_class = 'active'
a_highlighted_class = 'highlighted'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = '<ul class="subitems">'
sublink_opentag = '<li>'
sublink_closetag = '</li>'
sublisting_closetag = '</ul>'
link_closetag = '</li>'
listing_closetag = '</ul>'
box_closetag = ''
closetag = '</div>'}
{* ---------- выводим блок 2 ---------- *}
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $categories|default:false
filter = ''
namepath = 'Материнские платы / Asus'
maxlevel = 4
opentag = '<div class="categories-box">'
box_opentag = '<h2> Это блок 2 </h2>'
listing_opentag = '<ul>'
link_opentag = '<li>'
a_id = ''
a_class = ''
a_active_class = 'active'
a_highlighted_class = 'highlighted'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = '<ul class="subitems">'
sublink_opentag = '<li>'
sublink_closetag = '</li>'
sublisting_closetag = '</ul>'
link_closetag = '</li>'
listing_closetag = '</ul>'
box_closetag = ''
closetag = '</div>'}
{* ---------- выводим блок 3 ---------- *}
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $categories|default:false
filter = ''
namepath = 'Принтеры'
maxlevel = 4
opentag = '<div class="categories-box">'
box_opentag = '<h2> Это блок 3 </h2>'
listing_opentag = '<ul>'
link_opentag = '<li>'
a_id = ''
a_class = ''
a_active_class = 'active'
a_highlighted_class = 'highlighted'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = '<ul class="subitems">'
sublink_opentag = '<li>'
sublink_closetag = '</li>'
sublisting_closetag = '</ul>'
link_closetag = '</li>'
listing_closetag = '</ul>'
box_closetag = ''
closetag = '</div>'}
Как видно, мы каждый блок выводили с помощью одного модуля, просто меняя путевое имя желаемой категории и для примера оглавление контейнера. Модуль удобен тем, что позволяет прямо в параметрах задать:
-
items - из какой переменной движка брать записи категорий;
-
filter - какой фильтр применить к записям;
-
maxlevel - максимальное число выводимых уровней вложенности;
-
namepath - от какой ветки каталога начать вывод;
-
opentag и closetag - каким тегом (или html-фрагментом) будет открыт и закрыт блок;
-
box_opentag и box_closetag - каким тегом будет открыта и закрыта внутренняя часть блока;
-
listing_opentag и listing_closetag - каким тегом открывается и закрывается сам список категорий;
-
link_opentag и link_closetag - каким тегом открывается и закрывается каждый элемент списка;
-
sublisting_opentag и sublisting_closetag - каким тегом открывается и закрывается каждая подкатегория;
-
sublink_opentag и sublink_closetag - каким тегом открывается и закрывается каждый элемент подкатегории;
-
a_id и a_class - какой класс и/или идентификатор имеет каждая ссылка;
-
a_active_class - какой класс имеет ссылка активного элемента;
-
a_highlighted_class - какой класс у ссылки подсвеченного (выделенного в админпанели) элемента;
-
a_text_maxsize - до какого максимального размера обрезать текст ссылки, если он больше;
-
a_target - в каком окне должна открыться ссылка.
Вариант 2. Вывод блоков категорий по фильтру параметров.
Предположим известен перечень идентификаторов категорий, например 2, 37, 45, 61, которые хотелось бы вывести отдельными блоками. Используем тот же модуль, только задействуем в нем фильтр по полю
category_id, которое есть в каждой записи категории.
{* задаем наш список идентификаторов категорий *}
{$my_list = [2, 37, 45, 61]}
{* в цикле перебираем список идентификаторов *}
{foreach $my_list as $id}
{* выводим блок *}
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $categories|default:false
filter = ['category_id' => $id]
namepath = ''
maxlevel = 4
opentag = '<div class="categories-box">'
box_opentag = '<h2> Это категория с идентификатором '|cat:$id|cat:' </h2>'
listing_opentag = '<ul>'
link_opentag = '<li>'
a_id = ''
a_class = ''
a_active_class = 'active'
a_highlighted_class = 'highlighted'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = '<ul class="subitems">'
sublink_opentag = '<li>'
sublink_closetag = '</li>'
sublisting_closetag = '</ul>'
link_closetag = '</li>'
listing_closetag = '</ul>'
box_closetag = ''
closetag = '</div>'}
{/foreach}
Текущей версией данного модуля является 1.2, в ней фильтр считается массивом, тем самым позволяя в случае нужды фильтровать категории по нескольким полям сразу, однако еще не поддерживается возможность передать список (подмассив) в каком-то из элементов фильтра. Это сделаю в следующей версии, что позволит решать задачи, когда в один блок надо вывести категорию X + категорию Y + категорию Z, то есть когда фильтр способен быть записанным так: ['category_id' => [2, 37, 45, 61]].