Показ меню сайта

Меню является отражением структуры сайта и выводится с использованием метода show() контроллера показа структуры сайта Structure_Controller_Show().

Основные настройки контроллера показа задаются через методы:

  1. menu() — принимает идентификатор меню, узнать его можно в разделе администрирования;
  2. xsl() — принимает объект Xsl_Model.
<?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();
?>

XSL-шаблон для вывода связанных информационных систем и магазинов

При выводе в структуре сайта связанных элементов, теги этих элементов будут отличаться от тега 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.
    Как это можно исправить?

    15.06.2021 13:34:15
    DmitryOpalev

    Без темы

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

    15.06.2021 14:44:35
    hostcms
  • Заглушка в меню

    А есть какой-либо вариант сделать раскрывающееся по клику меню, кроме

    26.11.2013 14:29:23
    argghhh
  • Без темы

    если делать по этой инструкции не выводятся пункты подменю. подскажите, пожалуйста, как исправить?

    13.03.2013 03:15:39
    Slovo

    Без темы

    http://www.hostcms.ru/forums/2/8320/

    14.03.2013 13:02:01
    hostcms