Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.

#
Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
Например навигация в два или три уровня вложенности.

О компании
Услуги
-> Услуги А
     -> Услуги А1
     -> Услуги А2 и т.д.
-> Услуги Б

Как сделать правильный XML-шаблон чтоб когда мы находимся в "услугах" он выводил дополнительную навигацию с указанием только 2, 3 и других уровней вложенности текущего разела?
Модератор
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
designer,
Проверить, являются ли узлы текущего выбранного потомками того, для которого собираемся выводить подпункты.

Условие следующее:

<xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure"/>
</xsl:if>


см: http://www.hostcms.ru/forums/17/1622/page-2/
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
Не совсем получается. Если взять за основу код из последнего сообщения на странице http://www.hostcms.ru/forums/17/1622/page-2/, то выводится грубо говоря
весь 1 уровень и подуровни текущего раздела, а мне чтоб только подуровни текущего раздела, а 1 уровень вообще не выводился, даже текущий.
Например:
Экскурсия по школе
> Интерьеры школы
> Спортсооружения
> Ученики
> Праздники

То был вывод только последних 4 ссылок без "Экскурсия по школе". Как правильно сделать? Запутался
Модератор
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
designer,
так может проще при выводе на PHP указать ID родительской группы:
$Structure->ShowStructure(false,'Имя_XSL_Шаблона', array('parent_id' => CURRENT_STRUCTURE_ID));
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
То есть нужны подузлы текущего раздела структуры без указания самого раздела Вроде так
Модератор
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
designer,
тогда вышеуказанный код должен помочь
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
Ага, спасибо, работает

Только немного странно. Выводим альтернативное меню используя тот же XSL шаблон, что и меню слева (основное), только в меню слева все подузлы выводятся как ul внутри общей ul, а когда тот же шаблон выызваем через $Structure->ShowStructure(false,'Имя_XSL_Шаблона', array('parent_id' => CURRENT_STRUCTURE_ID)); то все подузлы идут как <li> не создавая новые Ul

Хотя понимаю, что так сложно понять о чем речь..
Модератор
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
designer,
Смотрите что написано в XSL-шаблоне, явно в нем <ul> почему то не добавляется
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
Еще проблемы обнаружились. Через CURRENT_STRUCTURE_ID получается выводить в Шаблонах страниц, а если в макете это нужно сделать?

Например, есть макет сайта. Меню входит не в Шаблоны страниц, а в Макет. В макете выводится сначала меню 1 уровня (высшего), а потом должны выводиться "дети" того раздела 1 уровня, на котором мы сейчас находимся. Вполне типовая задача.

Делаем так:

<!-- НачалоГлавноеМеню -->
<div id="submenu">
<?php
$Structure = & singleton('Structure');
$Structure->ShowStructure(1,'Меню первого уровня');
?>
</div>
<div id="clear"></div>
<!-- КонецГлавноеМеню -->
<!-- НачалоПодменю -->
<div id="submenu2">
<?php
$Structure = & singleton('Structure');
$Structure->ShowStructure(1,'Меню второго уровня');
?>
</div>
<!-- КонецПодменю -->


А вот как написать "меню второго уровня" не совсем понятно. То, что есть - не работает.

Пробовали добавлять секцию:
$Structure->ShowStructure(false,'Имя_XSL_Шаблона', array('parent_id' => CURRENT_STRUCTURE_ID));


Но это не помогает, т.к. видимо в макете нет CURRENT_STRUCTURE_ID.

Что же делать
#
Re: Вывод только той части меню, которая относится к разделу, в котором сейчас находимся.
Например, в нашем случае XSL шаблон "Меню второго уровня" выглядит так:

<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml" />
   
   <xsl:template match="/document">
            <div id="submenu2">
               <ul>
                  <!-- Выбираем узлы структуры -->
                  <xsl:apply-templates select="structure"/>
                  
               </ul>
            </div>
   </xsl:template>
   
   <xsl:template match="structure">
         <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
         <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
         <xsl:if test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">

         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show_link = 1">
                        <li>            
            <!-- Определяем адрес ссылки -->
            <xsl:variable name="link"><xsl:choose>
                  <!-- Если внешняя ссылка -->
                  <xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="external_link"/></xsl:when>
                  <!-- Иначе если внутренняя ссылка -->
                  <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>
                        </li>
         </xsl:if>
         </xsl:if>
   </xsl:template>
</xsl:stylesheet>


Но выводит этот шаблон меню верхней категории. Как вот здесь:

<xsl:template match="/document">
            <div id="submenu2">
               <ul>
                  <!-- Выбираем узлы структуры -->
                  <xsl:apply-templates select="structure"/>
                  
               </ul>
            </div>
   </xsl:template>


задать вывод только "дочерних" категорий, без вывода "верхней"?
Авторизация