Меню является отражением структуры сайта и выводится с использованием метода show() контроллера показа структуры сайта Structure_Controller_Show().
Основные настройки контроллера показа задаются через методы:
<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
)
->menu(1)
->show();
?>
В приведенном примере осуществляется создание экземпляра класса Structure_Controller_Show и вызов метода show(), с предшествующей передачей контроллеру идентификатора меню для показа menu(1) и указанием XSl шаблона xsl(Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')).
Меню сайта может быть представлено следующей структурой:
<ul class="top_menu"> <li> <a title="Магазин" href="/shop/">Магазин</a> </li> <li> <a title="Новости" href="/news/">Новости</a> </li> <li> <a title="Форум" href="/forums/">Форум</a> </li> <li> <a title="Контактные данные" href="/contacts/">Контактные данные</a> </li> </ul>
Как мы видим, меню обрамлено в блок <ul class="top_menu"> … </ul>, внутри меню каждый раздел представляет собой блок <li> … </li>.
Текущий активный раздел меню выделяется с помощью применения класса «current» к узлу <li>.
Просмотреть создаваемый системой XML можно в клиентском разделе с помощью кнопки на верхней панели.
Общая структура XML-документа структуры сайта:
<site id="ID"> ... <current_structure_id>ID</current_structure_id> <structure id="ID"> данные об узле структуры <structure id="ID"> ... </structure> <structure id="ID"> ... <structure id="ID"> вложенные узлы структуры (неограниченный уровень) </structure> </structure> </structure> <structure id="ID"> ... </structure> … множество узлов структуры </site>
XSL-шаблон для отображения меню представленной структуры:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE xsl:stylesheet> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:hostcms="https://www.hostcms.ru/" exclude-result-prefixes="hostcms"> <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/> <xsl:template match="/site"> <ul class="top_menu"> <!-- Выбираем узлы структуры первого уровня --> <xsl:apply-templates select="structure[show=1]" /> </ul> </xsl:template> <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю --> <xsl:variable name="current_structure_id" select="/site/current_structure_id"/> <xsl:template match="structure"> <li> <!-- Выделяем текущую страницу добавлением к li класса current, если это текущая страница, либо у нее есть ребенок с атрибутом id, равным текущей группе. --> <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1"> <xsl:attribute name="class">current</xsl:attribute> </xsl:if> <xsl:if test="position() = last()"> <xsl:attribute name="style">background-image: none</xsl:attribute> </xsl:if> <!-- Определяем адрес ссылки --> <xsl:variable name="link"> <xsl:choose> <!-- Если внешняя ссылка --> <xsl:when test="url != ''"> <xsl:value-of disable-output-escaping="yes" select="url"/> </xsl:when> <!-- Иначе если внутренняя ссылка --> <xsl:otherwise> <xsl:value-of disable-output-escaping="yes" select="link"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!-- Ссылка на пункт меню --> <a href="{$link}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"> <xsl:value-of disable-output-escaping="yes" select="name"/> </a> </li> </xsl:template> </xsl:stylesheet>
Контроллер показа структуры позволяет выводить в XML информацию о связанных с узлами структуры группах и информационных элементах. Обратите внимание, включение показа групп и элементов при большом количестве последних может значительно замедлить генерацию страницы.
Включение показа групп осуществляется через ->showInformationsystemGroups(TRUE)
, показ связанных информационных элементов через ->showInformationsystemItems(TRUE)
<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show
// Выводить связанные с узлом структуры группы информационной системы, по умолчанию FALSE
->showInformationsystemGroups(TRUE)
// Выводить связанные с узлом структуры информационные элементы, по умолчанию FALSE
->showInformationsystemItems(TRUE)
->menu(1)
->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
)
->show();
?>
Контроллер показа структуры позволяет выводить в XML информацию о связанных с узлами структуры группах магазина и товарах. Обратите внимание, включение показа групп и товаров при большом количестве последних может значительно замедлить генерацию страницы.
Включение показа групп магазина осуществляется через ->showShopGroups(TRUE)
, показ связанных товаров через ->showShopItems(TRUE)
<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));
$Structure_Controller_Show
// Выводить связанные с узлом структуры группы магазина, по умолчанию FALSE
->showShopGroups(TRUE)
// Выводить связанные с узлом структуры товары, по умолчанию FALSE
->showShopItems(TRUE)
->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
)
->menu(1)
->show();
?>
При выводе в структуре сайта связанных элементов, теги этих элементов будут отличаться от тега structure:
В таком случае вместо имени тега structure мы будем использовать *.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="https://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no"
version="1.0" media-type="text/xml"/>
<xsl:template match="/site">
<ul class="top_menu">
<!-- Выбираем узлы структуры первого уровня -->
<xsl:apply-templates select="child::*" />
</ul>
</xsl:template>
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
<xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
<xsl:template match="*">
<li>
<!--
Выделяем текущую страницу добавлением к li класса current,
если это текущая страница, либо у нее есть ребенок с атрибутом id, равным текущей группе.
-->
<xsl:if test="$current_structure_id = @id
or count(.//structure[@id=$current_structure_id]) = 1">
<xsl:attribute name="class">current</xsl:attribute>
</xsl:if>
<!-- Показывать ссылку, или нет -->
<xsl:if test="show = 1">
<!-- Set $link variable -->
<xsl:variable name="link">
<xsl:choose>
<!-- External link -->
<xsl:when test="url != ''">
<xsl:value-of disable-output-escaping="yes" select="url"/>
</xsl:when>
<!-- Internal link -->
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="link"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<a href="{$link}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a>
</xsl:if>
<!-- Выбираем подузлы структуры -->
<xsl:if test="count(child::*)">
<ul>
<!-- Выбираем узлы структуры -->
<xsl:apply-templates select="child::*"/>
</ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
Если в интернет-магазине используются ссылки (ярлыки) категории, то в панели навигации появляется ссылка вида
/shop/mycategory
вместо:
/shop/sub1/sub2/mycategory.
Как это можно исправить?
Суть проблемы не ясна, обратитесь в поддержку с описанием проблемы и данными по лицензии.
А есть какой-либо вариант сделать раскрывающееся по клику меню, кроме