Вопрос про многоуровневое меню

#
Вопрос про многоуровневое меню
Добрый день.
Сделал многоуровневое меню, опираясь на пост: http://www.hostcms.ru/forums/3/8441/.
При входе в раздел 1 уровня, где есть подуровни меню раскрывается. Все ок. При входе в раздел 2 уровня меню скрывается, а хотелось бы, чтобы оно оставалось открытым. С 3-м уровнем хотелось бы аналогично.
Кусок кода, где учитывается отображение я выделил. Как учитывать далее то, что мы в подуровнях?

<?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="http://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">
      <!-- Выбираем узлы структуры первого уровня -->
      <xsl:apply-templates select="*[@id][show=1][active=1]" />
   </xsl:template>
   
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
   
   <!-- Шаблон выборки дочерних узлов -->
   <xsl:template match="*">
      <xsl:variable name="sub" select="*[@id][show=1][active=1]" />
      
      <!-- Определяем адрес ссылки -->
      <xsl:variable name="link">
         <xsl:choose>
            <!-- Если внутренняя ссылка -->
            <xsl:when test="link != ''">
               <xsl:value-of disable-output-escaping="yes" select="link"/>
            </xsl:when>
            <!-- Если внешняя ссылка -->
            <xsl:otherwise>
               <xsl:value-of disable-output-escaping="yes" select="url"/>
            </xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <!-- Показывать ссылку? -->
      <span>
         <xsl:if test="$current_structure_id = @id and $sub">
            <xsl:attribute name="class">open</xsl:attribute>
         </xsl:if>
         
         <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         
         <xsl:if test="$sub">
            <ul class="second">
               <xsl:if test="$current_structure_id = @id">
                  <xsl:attribute name="style">display:block;</xsl:attribute>
               </xsl:if>
               <xsl:if test="$current_structure_id != @id">
                  <xsl:attribute name="style">display:none;</xsl:attribute>
               </xsl:if>

               
               <xsl:apply-templates select="$sub" mode="sub" />
            </ul>
         </xsl:if>
      </span>
   </xsl:template>
   
   
   <!-- Шаблон выборки дочерних узлов -->
   <xsl:template match="*" mode="sub">
      <xsl:variable name="othersub" select="*[@id][show=1][active=1]" />
      
      <li>
         <!-- Определяем адрес ссылки -->
         <xsl:variable name="link">
            <xsl:choose>
               <!-- Если внутренняя ссылка -->
               <xsl:when test="link != ''">
                  <xsl:value-of disable-output-escaping="yes" select="link"/>
               </xsl:when>
               <!-- Если внешняя ссылка -->
               <xsl:otherwise>
                  <xsl:value-of disable-output-escaping="yes" select="url"/>
               </xsl:otherwise>
            </xsl:choose>
         </xsl:variable>
         
         <!-- Показывать ссылку? -->
         <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
         
         <xsl:if test="$othersub">
            <ul class="othersub">
               <xsl:apply-templates select="$othersub" mode="sub" />
            </ul>
         </xsl:if>
         
      </li>
   </xsl:template>
</xsl:stylesheet>
Модератор
#
Re: Вопрос про многоуровневое меню
Начнем с того, что если подузлы у Вас инфосистема или магазин, то ничего не получится, ведь Вы показываете структуру. Нужно будет делать отдельные показы каталога с адаптацией примера.
#
Re: Вопрос про многоуровневое меню
В данном случае у меня все страницы статические. Поэтому этот вариант мне подойдет. Но в принципе было бы интересно учитывать все.
#
Re: Вопрос про многоуровневое меню
Чтобы учесть подузлы текущего узла структуры, достаточно изменить ось выборки XPath с @id на .//@id. Описание осей XPath можно посмотреть в разделе Документация

Но более органично будет заменить выделенный Вами фрагмент на:

<xsl:attribute name="style">
  <xsl:choose>
    <xsl:when test="$current_structure_id = .//@id">display:block;</xsl:when>
    <xsl:otherwise>display:none;</xsl:otherwise>
  </xsl:choose>
</xsl:attribute>
#
Re: Вопрос про многоуровневое меню
lozoffoy, спасибо за ссылку и подробные разъяснения. Все получилось.

Предлагаю не закрывать тему и довести ее до оптимального решения с учетом наличия в меню пунктов из инфосистем и магазинов. Я думаю людям пригодиться. Если у кого есть какие-то наработки в этой области, то расскажите о вашей реализации.
#
Re: Вопрос про многоуровневое меню
Здравствуйте! Сильно не пинайте, не знаю где искать и как сделать:
У меня двухуровневое меню. Каталог на основе информационной системы с группами и подгруппами. Когда нахожусь в первом уровне, он активный и второй уровень открывается. Когда захожу во второй уровень, первый уровень становится неактивным и соответственно второй уровень не открыт. Нужно сделать так, чтобы при нахождении на втором уровне он был открытым, т.е. первый уровень оставался активным.
В шаблоне вывожу так:
            <? // Меню каталога
            $Informationsystem_Controller_Show = new Informationsystem_Controller_Show(
               Core_Entity::factory('Informationsystem', 1)
            );
            $Informationsystem_Controller_Show
               ->xsl(
                  Core_Entity::factory('Xsl')->getByName('ГруппыИнфосистемыСлева')
               )
               ->groupsMode('all')
               ->limit(0);
            if (is_object(Core_Page::instance()->object)
               && get_class(Core_Page::instance()->object) == 'Informationsystem_Controller_Show')
               {
                  $Informationsystem_Controller_Show->addEntity(
                    Core::factory('Core_Xml_Entity')
                      ->name('current_group_id')
                      ->value(intval(Core_Page::instance()->object->group))
                  );
               }
               $Informationsystem_Controller_Show->show();
            ?>

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="http://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="/">
      <xsl:apply-templates select="/informationsystem"/>
   </xsl:template>
   
   <!-- Шаблон для магазина -->
   <xsl:template match="/informationsystem">
            <ul class="left-menu">
                <xsl:apply-templates select="informationsystem_group"/>
            </ul>
   </xsl:template>
   
   <!-- Шаблон для групп товара -->
   <xsl:template match="informationsystem_group">
        <li>
            <xsl:attribute name="class">
                <xsl:if test="informationsystem_group">parent</xsl:if>
                <xsl:if test="position() = last()"> last</xsl:if>
            </xsl:attribute>
         
            <xsl:variable name="informationsystem_group" select="count(informationsystem_group)" />
            <a href="{url}">
                <xsl:if test="@id = /informationsystem/current_group_id">
                    <xsl:attribute name="class">current-group</xsl:attribute>
                </xsl:if>
                <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>

            <!-- Если есть подгруппы -->
            <xsl:if test="informationsystem_group">
                <ul>
                    <xsl:apply-templates select="informationsystem_group" mode="pool"/>
                </ul>
            </xsl:if>
        </li>
        
    </xsl:template>

   <!-- Шаблон для групп товара -->
   <xsl:template match="informationsystem_group" mode="pool">
      <li>
         <a href="{url}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="informationsystem_group">
            <xsl:if test="@id = /informationsystem/current_group_id">
               <xsl:attribute name="class">current-group</xsl:attribute>
            </xsl:if>
            <xsl:value-of disable-output-escaping="yes" select="name"/>
         </a>
      </li>
   </xsl:template>
</xsl:stylesheet>

Помогите, пожалуйста, очень надо!..
www.dsaleks.ru - создание сайтов и интернет-магазинов
Авторизация