<?=$this->render($this->macros('content', 'menu', array(null, 1)), 'content/menu/top') ?>
Пример вызова
udata://content/menu/
XML-ответ UData
<udata module="content" method="menu" generation-time="0.006117">
<items>
<item id="1" link="/" xlink:href="upage://1">Добро пожаловать</item>
<item id="2" link="/talks/" xlink:href="upage://2">Форум</item>
<item id="12" link="/vse_novosti/" xlink:href="upage://12">Все новости</item>
<item id="26" link="/contacts/" xlink:href="upage://26">Обратная связь</item>
<item id="27" link="/umicms/" xlink:href="upage://27">FAQ</item>
<item id="33" link="/butterfly/" xlink:href="upage://33">Фотогалерея</item>
<item id="42" link="/obychnaya_stranica/" xlink:href="upage://42">Обычная страница</item>
<item id="43" link="/market/" xlink:href="upage://43" status="active">Каталог товаров</item>
</items>
</udata>
Если нужно отобразить элементы вложенного подменю, следует задать параметр root_element_id
, указав id элемента item
, вложенные элементы которого требуется обработать.
Например так: udata://content/menu/notemplate/0/12
Тогда будет получен следующий ответ UData:
<udata module="content" method="menu" generation-time="0.007229">
<items>
<item id="13" link="/vse_novosti/politicheskie_novosti/"
xlink:href="upage://13">Политические новости</item>
<item id="19" link="/vse_novosti/novosti_ekonomiki/"
xlink:href="upage://19">Новости экономики</item>
</items>
<id>12</id>
</udata>
Для того, чтобы помечать активный пункт меню, следует описать шаблон для элемента item
с атрибутом status = 'active'
(см. ниже пример использования).
Элементы и атрибуты
<item>
Элемент, описывающий отдельный пункт меню.
- @id
-
Идентификатор страницы, отображаемой в меню.
- @link
-
Путь до страницы, отображаемой в меню.
- @xlink:href
-
Ссылка UPage на страницу, отображаемую в меню.
- @status
-
Наличие этого атрибута со значением "active" указывает активный пункт меню (т.е. макрос вызван со страницы, являющейся этим пунктом меню).
Примеры использования
Для того, чтобы вставить меню в определенное место на странице, необходимо вызвать макрос по протоколу UData. Укажем в шаблоне дизайна место вывода меню при помощи инструкции apply-templates
:
<div class="page">
<div class="left">
<!-- вставляем результаты обработки данных макроса -->
<xsl:apply-templates select="document('udata://content/menu/')/udata"/>
</div>
<div class="content">
<!-- контент страницы -->
</div>
</div>
Теперь необходимо описать шаблон, обрабатывающий результаты макроса и выводящий весь список:
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
<ul>
<!-- здесь мы выведем отдельные элементы списка -->
<xsl:apply-templates select="items/item" mode="menu"/>
</ul>
</xsl:template>
Теперь опишем шаблон для неактивного пункта меню:
<xsl:template match="item" mode="menu">
<li>
<a href="{@link}">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
</li>
</xsl:template>
И шаблон с уточняющим условием match="item[@status = 'active']" для активного пункта меню:
<xsl:template match="item[@status = 'active']" mode="menu">
<li>
<a href="{@link}" class="active">
<!-- выводим название страницы - содержимое item -->
<xsl:value-of select="." />
</a>
</li>
</xsl:template>
Замечание
Вместо "." (точки), обозначающей значение текущего элемента, можно использовать атрибут name
:
<xsl:template match="item[@status = 'active']" mode="menu">
<li>
<a href="{@link}" class="active">
<xsl:value-of select="@name" />
</a>
</li>
</xsl:template>
В таком виде необходимо выводить значение, когда мы выводим многоуровневое меню. См. также Различные меню средствами XSLT-шаблонизатора
Вывод меню осуществляется по шаблону, указанному в параметре template. Вы можете не указывать этот параметр, тогда для вывода будет использован шаблон по умолчанию — default.tpl
.
Используемые блоки шаблона
menu_block_levelX
Выводит обрамляющий блок для вывода меню, куда будут подставляться пункты меню. Пункты меню будут отрисованы по блокам шаблона menu_line_levelX и menu_line_levelX_a. «X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
- %lines%
-
Выводит список пунктов меню, отрисованных с помощью блоков menu_line_levelX и menu_line_levelX_a .
- %id%
-
Выводит id страницы, которая является корневой для текущего уровня меню.
menu_line_levelX
Отвечает за вывод отдельного пункта меню в том случае, выводимая страница неактивна (т.е. не является текущей страницей и не является родительской страницей по отношению к текущей странице). Страницы, у которых не стоит галочка Отображать в меню отображены в меню не будут, так же как и страницы, к которым нет доступа у текущего пользователя (редактируется во вкладке Права доступа). «X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
- %id%
-
Выводит id пункта меню.
- %text%
-
Выводит название пункта меню (название страницы).
- %link%
-
Выводит ссылку на пункт меню.
- %num%
-
Порядковый номер страницы в выводе, считается для каждого уровня меню отдельно (1, 2, 3, 4, ...).
- %sub_menu%
-
Выводит подменю следующего уровня в том случае, если для него заданы блоки в шаблоне и у текущего пункта меню в настройках стоит галочка Показывать подменю.
- %separator%
-
Выводит разделитель между пунктами меню, если он описан в блоке separator .
- %class%
-
Выводит CSS-класс для пункта меню, используя блок menu_class_levelX или menu_class_levelX_last .
menu_line_levelX_a
Отвечает за вывод отдельного пункта меню в том случае, выводимая страница активна (т.е. является текущей страницей или является родительской страницей по отношению к текущей странице). «X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
- %id%
-
Выводит id пункта меню.
- %text%
-
Выводит название пункта меню (название страницы).
- %link%
-
Выводит ссылку на пункт меню.
- %num%
-
Порядковый номер страницы в выводе, считается для каждого уровня меню отдельно (1, 2, 3, 4, ...).
- %sub_menu%
-
Выводит подменю следующего уровня в том случае, если для него заданы блоки в шаблоне.
- %separator%
-
Выводит разделитель между пунктами меню, если он описан в блоке separator .
- %class%
-
Выводит CSS-класс для пункта меню, используя блок menu_class_levelX или menu_class_levelX_last .
menu_line_levelX_in
Отвечает за вывод отдельного пункта меню в том случае, если выводимый пункт меню является родительской страницей по отношению к текущей странице. Этот блок используется только если параметр max_depth больше 1.
«X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
Локальные макросы аналогичны блоку menu_line_levelX_a
.
menu_class_levelX
Выводит CSS-класс для всех пунктов меню, кроме последнего. Можно использовать в блоках menu_line_levelX и menu_line_levelX_a для стилевого оформления пункта меню. «X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
menu_class_levelX_last
Выводит CSS-класс только для последнего пункта меню. Можно использовать в блоках menu_line_levelX и menu_line_levelX_a для стилевого оформления пункта меню. «X» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.
Примеры использования
Обратите внимание!
Параметр "Меню всегда развернуто" не будет действовать на указанный в примере шаблон, так как в нём не указано место для вывода списка страниц, дочерних неактивным страницам. Для того чтобы на каждой странице в меню выводились все страницы, отмеченные галочками "Отображать в меню" и "Показывать подменю" - следует вставить макрос %sub_menu% в нужные места блоков menu_line_level1, menu_line_level2, и т.д.
В шаблоне дизайна поставьте макрос %content menu('sample', 3)%.
Создайте в структуре сайта несколько вложенных страниц с произвольным содержанием.
Создайте файл sample.tpl
в папке /tpls/content/menu/
следующего содержания:
<?php
$FORMS = Array();
$FORMS['menu_block_level1'] = <<<END
<div class="bg_header_forum">
<div class="header_title">Рубрикатор</div>
</div>
<div class="background_forum">
<ul id="left_forum">
%lines%
</ul>
</div>
END;
$FORMS['menu_line_level1'] = <<<END
<li><a href="%link%">%text%</a></li>
END;
$FORMS['menu_line_level1_a'] = <<<END
<li><a href="%link%">%text%</a></li>
%sub_menu%
END;
$FORMS['menu_block_level2'] = <<<END
<ul id="submenu">
%lines%
</ul>
END;
$FORMS['menu_line_level2'] = <<<END
<li><a href="%link%">%text%</a></li>
END;
$FORMS['menu_line_level2_a'] = <<<END
<li class="active"><a href="%link%">%text%</a></li>
%sub_menu%
END;
$FORMS['menu_block_level3'] = <<<END
<li>
<ul>
%lines%
</ul>
</li>
END;
$FORMS['menu_line_level3'] = <<<END
<li><a href="%link%">%text%</a></li>
END;
$FORMS['menu_line_level3_a'] = <<<END
<li class="active">%text%</li>
END;
?>
Такой шаблон выведет на сайт все корневые страницы, у которых активен параметр "Отображать в меню", а также страницы, являющиеся дочерними по отношению к активной странице. При этом у активной страницы должен быть активирован параметр "Показывать подменю".
Название
%content menu()% — Выводит меню сайта по определенному шаблону.
Параметры: content menu([template = 'default', max_depth = '1', root_element_id = '0', $showHasChildren = '0', $currentPageId = '0'])
- template
-
Имя шаблона, по которому следует вывести меню сайта.В XSLT-шаблонизаторе игнорируется, можно указать любое значение.
- max_depth
-
Ограничитель, который указывает максимальное кол-во уровней меню, которые необходимо вывести.В XSLT-шаблонизаторе до версии 2.8 игнорируется.
- root_element_id
-
Если указан этот параметр, то меню отсчитываться не от корня дерева сайта, а от определенной страницы сайта.
- showHasChildren
-
Помечать ли пункты меню, если у них есть дочерние пункты.
- currentPageId
-
ID cтраницы, которую нужно считать текущей.