На сайте мне надо отдельно вывести блок с подкатегориями той, какую сейчас просматривает покупатель. Как это сделать?
На сайте мне надо отдельно вывести блок с подкатегориями той, какую сейчас просматривает покупатель. Как это сделать?
Найдите в нужном tpl-файле шаблона то место, где вы хотите вывести отдельный блок с подкатегориями текущей категории, и впишите туда вызов модуля AIMatrix Categories со своими параметрами. Пример (отступы в параметрах, начиная с параметра opentag, сделаны для удобства чтения и понимания того, как теги конечного списка вложены друг в друга):
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $category->subcategories|default:false
filter = ''
namepath = ''
maxlevel = 1
opentag = ''
box_opentag = ''
listing_opentag = '<ul>'
link_opentag = '<li class="item">'
a_id = ''
a_class = ''
a_active_class = 'selected-item'
a_highlighted_class = 'highlighted-item'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = '<ul class="sub-items">'
sublink_opentag = '<li class="sub-item">'
sublink_closetag = '</li>'
sublisting_closetag = '</ul>'
link_closetag = '</li>'
listing_closetag = '</ul>'
box_closetag = ''
closetag = ''}
Этот модуль был создан специально для верстальщиков. Как раз для случаев, когда нужно вывести категории товаров или подкатегории отдельной категории и сразу указать, в какие теги должны быть заключены элементы списка.
Приведу здесь заголовочную часть модуля, там расписано какие входные параметры принимает модуль.
{* <!-- ===========================================================================
Система: Impera CMS |
Модуль: AIMatrix Categories |
Версия модуля: 1.2 |
Автор: Разработчик Impera CMS |
Сайт автора: http://imperacms.com |
|
Файл: categories.htm - блок категорий |
Тип: основной файл модуля |
|
|
|
Принимает во входных переменных: |
$items = массив записей о категориях |
$filter = массив фильтра записей (по умолчанию пустой массив) |
$namepath = именованный путь (через слеши) выводимой ветки переданного |
дерева категорий (по умолчанию пустая строка) |
$opentag = html-фрагмент открывающего тега блока категорий |
(по умолчанию пустая строка) |
$closetag = html-фрагмент закрывающего тега блока категорий |
(по умолчанию пустая строка) |
$box_opentag = html-фрагмент открывающего тега контейнера категорий |
(по умолчанию пустая строка) |
$box_closetag = html-фрагмент закрывающего тега контейнера категорий |
(по умолчанию пустая строка) |
$listing_opentag = html-фрагмент открывающего тега списка категорий |
(по умолчанию пустая строка) |
$listing_closetag = html-фрагмент закрывающего тега списка категорий |
(по умолчанию пустая строка) |
$link_opentag = html-фрагмент открывающего тега ссылки категории |
(по умолчанию пустая строка) |
$link_closetag = html-фрагмент закрывающего тега ссылки категории |
(по умолчанию пустая строка) |
$sublisting_opentag = html-фрагмент открывающего тега списка подкатегорий |
(по умолчанию пустая строка) |
$sublisting_closetag = html-фрагмент закрывающего тега списка подкатегорий |
(по умолчанию пустая строка) |
$sublink_opentag = html-фрагмент открывающего тега ссылки родительской |
категории (по умолчанию пустая строка) |
$sublink_closetag = html-фрагмент закрывающего тега ссылки родительской |
категории (по умолчанию пустая строка) |
$a_id = идентификатор A-элементов (по умолчанию пустая строка) |
$a_class = класс A-элементов (по умолчанию пустая строка) |
$a_active_class = класс активного A-элемента (по умолчанию пустая строка) |
$a_highlighted_class = класс подсвеченного A-элемента (по умолчанию пустая |
строка) |
$a_target = указатель целевого окна A-элементов (по умолчанию пустая строка) |
$a_text_maxsize = предельная длина текста в A-элементе (по умолчанию 256) |
$maxlevel = предельное число выводимых уровней дерева категорий (по умолч.16) |
|
|
|
Подключение из своего шаблона: |
{include file = '../../common_parts/AIMatrix/categories.htm' |
items = переменная с категориями |
namepath = именованный путь ветки или пустая строка |
filter = массив, где ключи равны именам фильтруемых полей записи |
maxlevel = число от 1 и более |
opentag = html-фрагмент или пустая строка |
box_opentag = html-фрагмент или пустая строка |
listing_opentag = html-фрагмент или пустая строка |
link_opentag = html-фрагмент или пустая строка |
a_id = идентификатор или пустая строка |
a_class = имя класса (или классов через пробел) или пустая |
a_active_class = имя класса (или классов) или пустая строка |
a_highlighted_class = имя класса (или классов) или пустая |
a_target = указатель целевого окна или пустая строка |
a_text_maxsize = число от 1 и более |
sublisting_opentag = html-фрагмент или пустая строка |
sublink_opentag = html-фрагмент или пустая строка |
sublink_closetag = html-фрагмент или пустая строка |
sublisting_closetag = html-фрагмент или пустая строка |
link_closetag = html-фрагмент или пустая строка |
listing_closetag = html-фрагмент или пустая строка |
box_closetag = html-фрагмент или пустая строка |
closetag = html-фрагмент или пустая строка} |
|
============================================================================ --> *}
Собственно, модуль этот мощный и позволяет выводить категории разным образом. Например, хотим вывести все подкатегории первого уровня из категории "Бытовая техника / Холодильники", но в виде простейшего списка, где есть лишь теги <a> со ссылками на подкатегории, перечисленные через теги перевода строки <br>, и например все это хотим озаглавить тегом <h2>. Тогда в желаемое место шаблона ставим такой вызов модуля:
{include file = '../../common_parts/AIMatrix/categories.htm'
items = $categories|default:false
filter = ''
namepath = 'Бытовая техника / Холодильники'
maxlevel = 1
opentag = ''
box_opentag = ''
listing_opentag = '<h2> Холодильники </h2>'
link_opentag = ''
a_id = ''
a_class = ''
a_active_class = 'selected-item'
a_highlighted_class = 'highlighted-item'
a_text_maxsize = 256
a_target = ''
sublisting_opentag = ''
sublink_opentag = ''
sublink_closetag = '<br>'
sublisting_closetag = ''
link_closetag = '<br>'
listing_closetag = ''
box_closetag = ''
closetag = ''}
Результирующий список окажется таким:
<h2> Холодильники </h2> <a href="http://домен.сайта/url_подкатегории_Indesit">Indesit</a><br> <a href="http://домен.сайта/url_подкатегории_Bosh">Bosh</a><br> <a href="http://домен.сайта/url_подкатегории_Samsung">Samsung</a><br>
Для подобных целей в Impera CMS существует модуль Category Map - карта категории / бренда. Большой набор опционально задаваемых входных параметров служит цели сообщить модулю те особенности нашей html-разметки, в которой хотим видеть отрисованную карту категорий.
Поясню на примере. Представим, дизайнер нарисовал нам карту категорий, где каждую верхнего уровня изобразил картинкой слева и кликабельным названием, а под названием перечислены через запятую кликабельные названия подкатегорий. Длина перечисления - не более 7 подкатегорий, а когда их больше - дизайнер сказал ставить ссылку все... в конец перечисления.

Предположим дальше, разверстав свою графическую работу (psd) в html, дизайнер передал нам следующий фрагмент html-кода, так сказать демонстрационную верстку.
Для упрощения мы обозначим в коде символом троеточия повторяющиеся (идентичные по теговому наполнению) LI-фрагменты кода. Далее без намека на значимость одного цвета перед другим, а только ради чередующегося обозначения уровня вложенности, выделим серым и синим цветом детали разметки, которые интересны нам для описания этих деталей в параметрах модуля.
<ul id="cat_map"> <li> <a href="url" class="image"> <img src="url" width="80" /> </a> <h2> <a href="url" class="link"> категория </a> </h2> <div class="subcats"> <a href="url" class="sublink"> подкатегория 1 </a>, <a href="url" class="sublink"> подкатегория 2 </a>, <a href="url" class="sublink"> подкатегория 3 </a>, <a href="url" class="sublink"> подкатегория 4 </a>, <a href="url" class="sublink"> подкатегория 5 </a>, <a href="url" class="sublink"> подкатегория 6 </a>, <a href="url" class="sublink"> подкатегория 7 </a>, <a onclick="return map_more(this);"> все... </a> </div> </li> ... ... </ul> <script> function map_more ( el ) { jQuery(el).closest('li').find('h2 > a.link').click(); return false; } </script>
Если сказать огрубленно, нам необходимо выделить "почерк дизайнера" из демонстрационной верстки и просто сообщить его модулю. Соответственно при работе с натяжкой дизайна, а именно когда человек пользуется готовыми модулями для Impera CMS, люди все чаще отмечают, что на первый план выступает умение управляться с параметрами. Из того многообразия, что принимает на входе какой-нибудь модуль, использовать только нужные параметры, остальные сбрасывая в пустые значения.
Ниже смотрите пример, что у нас должно было получиться в финале. Цветовая раскраска особенностей html-разметки ("почерка дизайнера") взята из кода выше, чтобы вы могли ясно видеть, какие детали "почерка" в какой параметр мы передаем. Жирным обозначены вспомогательные настройки, как то:
{include file = '../../common_parts/AIMatrix/Constructor/category-map.htm'
item = $category|default:false
maxcount = 1000000
submaxcount = 7
show_empty = true
no_image = 'no_photo.png'
opentag = ''
listing_opentag = '<ul id="cat_map">'
listing_hider_opentag = ''
link_separator = ''
link_opentag = '<li>'
info_opentag = ''
show_icon = true
icon_opentag = ''
icon_a_params = 'class="image"'
icon_img_params = 'width="80"'
icon_closetag = ''
show_name = true
name_opentag = '<h2>'
name_maxsize = 256
name_a_params = 'class="link"'
name_closetag = '</h2>'
show_descr = false
descr_opentag = ''
descr_maxsize = 256
descr_closetag = ''
info_closetag = ''
show_sublisting = true
sublisting_opentag = '<div class="subcats">'
sublisting_hider_opentag = ''
sublink_separator = ','
sublink_opentag = ''
subinfo_opentag = ''
show_subicon = false
subicon_opentag = ''
subicon_a_params = ''
subicon_img_params = ''
subicon_closetag = ''
show_subname = true
subname_opentag = ''
subname_maxsize = 256
subname_a_params = 'class="sublink"'
subname_closetag = ''
show_subdescr = false
subdescr_opentag = ''
subdescr_maxsize = 128
subdescr_closetag = ''
subinfo_closetag = ''
sublink_closetag = ''
sublisting_hider_closetag = ''
sublisting_closetag = '</div>'
sublisting_moretag = '<a onclick="return map_more(this);">все...</a>'
link_closetag = '</li>'
listing_hider_closetag = ''
listing_closetag = '</ul>'
listing_moretag = ''
closetag = '<script>
function map_more ( el ) {
jQuery(el).closest('li').find('h2 > a.link').click();
return false;
}
</script> '}
Также привожу заголовочную часть модуля, здесь кратко обозначены значения всех входных параметров.
{* <!-- ===========================================================================
Система: Impera CMS |
Сайт системы: http://imperacms.com/ |
|
|
|
Библиотека: Impera CMS Template Constructor |
Модуль: Category Map - карта категории / бренда |
Версия модуля: 1.0 |
Автор: Разработчик Impera CMS |
|
|
|
Принимает во входных переменных: |
$item = запись о категории/бренде |
$maxcount = предельное число выводимых записей |
$submaxcount = предельное число выводимых вложенных записей |
$show_empty = булевой признак "показывать и пустые" |
$no_image = имя (относительно папки images шаблона) картинки "нет фото" |
$opentag = открывающий тег блока |
$listing_opentag = открывающий тег списка |
$listing_hider_opentag = открывающий тег спрятанной области списка |
$link_separator = разделитель элементов списка |
$link_opentag = открывающий тег элемента списка |
$info_opentag = открывающий тег информации об элементе |
$show_icon = булевой признак "показывать иконку" |
$icon_opentag = открывающий тег картинки |
$icon_a_params = дополн.опции тега ссылки картинки|
$icon_img_params = дополнительные опции тега IMG |
$icon_closetag = закрывающий тег картинки |
$show_name = булевой признак "показывать название" |
$name_opentag = открывающий тег названия |
$name_maxsize = предельный размер названия |
$name_a_params = дополнит.опции тега ссылки назв. |
$name_closetag = закрывающий тег названия |
$show_descr = булевой признак "показывать описание" |
$descr_opentag = открывающий тег описания |
$descr_maxsize = предельный размер описания |
$descr_closetag = закрывающий тег описания |
$info_closetag = закрывающий тег информации об элементе |
$show_sublisting = булевой признак "показывать подсписки" |
$sublisting_opentag = открывающий тег подсписка |
$sublisting_hider_opentag = открыв.тег спрят.области |
$sublink_separator = разделитель элементов |
$sublink_opentag = открыв.тег элемента подсписка |
$subinfo_opentag = открыв.тег информ.об элем. |
$show_subicon = бул.признак "показ.иконку"|
$subicon_opentag = открыв.тег картинки|
$subicon_a_params = дополн.опции A|
$subicon_img_params = доп.опц.IMG |
$subicon_closetag = закр.тег картинки |
$show_subname = бул.признак "показ.назв." |
$subname_opentag = открыв.тег названия|
$subname_maxsize = предел.размер |
$subname_a_params = допол.опции A |
$subname_closetag = закр.тег названия |
$show_subdescr = бул.признак "показ.назв."|
$subdescr_opentag = откр.тег описания |
$subdescr_maxsize = предел.размер |
$subdescr_closetag = закр.тег описания|
$subinfo_closetag = закрыв.тег информ.об элем.|
$sublink_closetag = закрыв.тег элемента подсписка |
$sublisting_hider_closetag = закр.тег спрят.области |
$sublisting_closetag = закрывающий тег подсписка |
$sublisting_moretag = тег кнопки ВСЕ подсписка |
$link_closetag = закрывающий тег элемента списка |
$listing_hider_closetag = закрывающий тег спрятанной области списка |
$listing_closetag = закрывающий тег списка |
$listing_moretag = тег кнопки ВСЕ списка |
$closetag = закрывающий тег блока |
Остается сказать, что карту категорий - вызов модуля Category Map - обычно располагают в файле products.tpl с тем учетом, чтобы на страницах наивысших корневых категорий показывать карту, во всех же подкатегориях показывать стандартный список товаров. Следовательно в файл products.tpl вносят развилочное условие, которое показывает вместо списка товаров карту категорий, если мы находимся в наивысшей категории (то есть массив ее пути - он доступен через $category->path - содержит всего один узел).
{* если находимся в наивысшей категории и она содержит подкатегории *}
{if ($category->path|default:null|count == 1)
&& isset($category->subcategories) && is_array($category->subcategories) && !empty($category->subcategories)}
{* выводим карту категорий *}
{include file = '../../common_parts/AIMatrix/Constructor/category-map.htm'
...
...
...}
{* иначе выводим список товаров как обычно *}
{else}
...
...
...
{/if}
Еще один вариант - использовать модуль Listing все из той же библиотеки Impera CMS Template Constructor. Данный модуль проще в количестве настроек, а специфика его работы заключена в последовательном переборе указанных записей (например категорий, брендов, товаров, статей и так далее) и вызове для каждой записи некоторой цепочки includes (например других модулей или произвольных фрагментов html-разметки).
То есть мы не сообщаем модулю детали внутренней разметки "карточки" категории, а только детали внешней разметки и передаем указатель на файл другого модуля, который и будет заниматься отрисовкой каждой карточки.
Для простоты представим, мы создали внутри своего шаблона папку common и поместили в нее свой модуль category-card.tpl (имена папки и файла модуля можете придумать свои). Тогда вот некий пример вызова модуля.
{include file = '../../common_parts/AIMatrix/Constructor/listing.htm'
items = $category->subcategories|default:false
maxcount = 1000000
opentag = ''
title_opentag = ''
title_a_href = ''
title_a_params = ''
title = ''
title_closetag = ''
box_opentag = '<ul id="cat_map">'
listing_opentag = ''
link_opentag = ''
includes = ['common/category-card.tpl']
link_closetag = ''
listing_closetag = ''
box_closetag = '</ul>'
closetag = '<script>
function map_more ( el ) {
jQuery(el).closest('li').find('h2 > a.link').click();
return false;
}
</script> '}
Примечательно, что параметр includes - это массив. Вполне можно указать цепочки отрисовочных действий, которые хотелось бы применить к каждой записи. Неудобство в том, что строки произвольного текста, если уж захотелось писать их здесь, а не в подключаемом модуле, нужно снабжать любым html-тегом (в принципе достаточно символа < или > в такой строке), чтобы модуль не принял эту строку за имя файла подключаемого модуля. Например
includes = ['<p> сначала нарисуй мне этот текст и затем </p>',
'common/category-card.tpl',
'<p> далее нарисуй этот текст, а следом еще 3 модуля </p>',
'anything/something-1.tpl',
'modules/something-2.tpl',
'common/something-3.tpl']
Общее правило для всех подключаемых модулей, перечисленных в параметре includes: каждому вызванному модулю в переменной $item передается только что отобранная запись. Остальные переменные, видимые модулю-вызывателю (им выступает модуль Listing), также видны и вызванному модулю согласно стандартам области видимости переменных. Это позволяет на уровне вышестоящего модуля (скажем который сам вызвал модуль Listing) установить какой-то набор дополнительных параметров, чтобы они были доступны цепочке нижестоящих вызываемых модулей.
Напоследок пример того, как может выглядеть тот воображаемый нами модуль common/category-card.tpl, который мы разместили бы внутри папки своего шаблона. Синим цветом обозначены части, относящиеся к "почерку дизайнера". Серым цветом - комментарии.
{* если действительно получена запись *}
{if isset($item) && is_object($item)}
{* формируем url страницы *}
{$url = ($site|default:'')|cat:($item->url_path|default:'')|cat:($item->url|default:'')}
{* формируем url картинки *}
{$image = $item->image|default:(($theme|default:'')|cat:'images/no_photo.png')}
<li>
{* картинка категории *}
<a href="{$url|escape}" class="image">
<img src="{$image|escape}" width="80" />
</a>
{* название категории *}
<h2>
<a href="{$url|escape}" class="link">
{$item->name|default:'Без названия!'|escape}
</a>
</h2>
{* если имеет подкатегории *}
{if isset($item->subcategories) && is_array($item->subcategories) && !empty($item->subcategories)}
{$count = 0}
<div class="subcats">
{* перебираем подкатегории *}
{foreach $item->subcategories as $cat}
{* показываем не более 7 подкатегорий *}
{$count = $count + 1}
{if $count <= 7}
{* формируем url страницы *}
{$url = ($site|default:'')|cat:($cat->url_path|default:'')|cat:($cat->url|default:'')}
{* название подкатегории *}
<a href="{$url|escape}" class="sublink">
{$cat->name|default:'Без названия!'|escape}
</a>,
{* иначе уже перебор - надо прервать цикл *}
{else}
{* кнопка ВСЕ *}
<a onclick="return map_more(this);"> все... </a>
{break}
{/if}
{/foreach}
</div>
{/if}
</li>
{/if}
Скажите, а что нужно передать в параметр item = чтобы карта всех категорий отображалась на главной (и только на ней) странице сайта, там где переменной $category еще нет?