Логотип

Документация по макросам и шаблонам UMI.CMS

<?=$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' (см. ниже пример использования).

Элементы и атрибуты

<items>

Ветвь, содержащая элементы item — страницы, отображаемые в меню.

<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.

Используемые шаблоны

Макрос оперирует шаблонами, находящимися в каталоге /tpls/content/menu/.

Используемые блоки шаблона

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» в названии блока обозначает номер уровня меню, для которого будет использоваться этот блок.

separator

Содержит разделитель, который можно вывести в блоках menu_line_levelX и menu_line_levelX_a для разделения пунктов меню.

separator_last

Содержит разделитель, который будет выводится последним в блоках menu_line_levelX и menu_line_levelX_a.

Примеры использования

Обратите внимание!
Параметр "Меню всегда развернуто" не будет действовать на указанный в примере шаблон, так как в нём не указано место для вывода списка страниц, дочерних неактивным страницам. Для того чтобы на каждой странице в меню выводились все страницы, отмеченные галочками "Отображать в меню" и "Показывать подменю" - следует вставить макрос %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траницы, которую нужно считать текущей.

Описание

Этот макрос выводит меню сайта с максимальным количеством выводимых уровней меню max_depth. Если параметр max_depth не указан, то считается, что он равен «1».