Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта

#
Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта
Есть меню, в нем наличествуют как страницы, например "о нас" и ее потомок "контакты", так и инфосистемы с группами. Как сделать двухуровневое меню из страниц я знаю, и как сформировать XML-дерево из инфосистем и их подгрупп я тоже знаю, но это решается несколько разными способами. (Как их совместить в одном меню?)
Собственно вопрос, как реализовать возможность генерировать пункты для двухуровневого меню из элементов структуры сайта, в случае когда они являются страницами и в случае, когда они вляются многоуровневыми инфосистемами?

Пока что вот такой базовый код:
<?php
   // Верхнее меню
   $Structure_Controller_Show = new Structure_Controller_Show(
      Core_Entity::factory('Site', CURRENT_SITE));

   $Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
      ->getByName('ВерхнееМеню'))
      ->menu(4)
      ->level(1)
      ->show();
   ?>








Код, который я нашел на форуме не срабатывает, в xml ничего из ИС не засвечивается:
        ->showInformationsystemGroups(TRUE)
        ->showInformationsystemItems(FALSE)
#
Re: Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта
catfelix150,
        ->showInformationsystemGroups(TRUE)
         ->showInformationsystemItems(FALSE)

перед show() добавляете?
HostDev.pw - модули для HostCMS, Telegram: @hostdev
#
Re: Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта
У меня получилось самостоятельно! Ура товарищи!

Выкладываю "кейс" будущим посетителям из поисковых систем.

В макете:

<?php
// Верхнее меню
$Structure_Controller_Show = new Structure_Controller_Show(
Core_Entity::factory('Site', CURRENT_SITE));

$Structure_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName('ВерхнееМеню')
)
   // Показывать группы информационных систем в карте сайта
   ->showInformationsystemGroups(TRUE)
   ->menu('4');

if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Informationsystem_Controller_Show'){
   $Structure_Controller_Show->addEntity(
   Core::factory('Core_Xml_Entity')
      ->name('informationsystem_group_id')
      ->value(intval(Core_Page::instance()->object->group))
   );
}

$Structure_Controller_Show->show();
?>


где    ->menu('4'; это ID менюшки!


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="/site">
      <ul class="nav navbar-nav">
         <!-- Выбираем узлы структуры первого уровня -->
         <xsl:apply-templates select="structure[show=1]" />
      </ul>
   </xsl:template>
   
   <!-- Запишем в константу ID структуры, данные для которой будут блаблабла и тд -->
   <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>

   
   <!-- перебор элементов первого (ROOT) уровня начинается отсюда, с заключение каждого в тег li -->
   <xsl:template match="structure">
      <li>
         <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">
            <xsl:attribute name="class">active</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>
         
         <xsl:choose>
            <xsl:when  test="count(informationsystem_group) &gt; 0">
            <!-- Если текущий элемент является инфосистемой и у нее внутри есть хотя-бы одна группа -->
            <a href="{$link}" class="dropdown-toggle" data-toggle="dropdown" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/><b class="caret"></b></a>
               <ul class="dropdown-menu">
                  <xsl:apply-templates select="informationsystem_group[show=1]" mode="InfoSystem" />
               </ul>
            </xsl:when>
            
            <!-- Если текущий элемент является элементом структуры сайта с потомками, не инфосистемой -->
            <xsl:when  test="count(structure) &gt; 0">
            <a href="{$link}" class="dropdown-toggle" data-toggle="dropdown" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/><b class="caret"></b></a>
               <ul class="dropdown-menu">
                  <xsl:apply-templates select="structure[show=1]" />
               </ul>
            </xsl:when>
            <!-- Если текущий элемент не имеет потомков  -->
            <xsl:otherwise>
               <a href="{$link}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:otherwise>
         </xsl:choose>
      </li>
   </xsl:template>
   

   
   
   
   
   
   <!-- Ух ты! Всех потомков элемента, являющегося инфосистемой, отправляем на перебор сюда.  -->
   <xsl:template match="informationsystem_group" mode="InfoSystem">
      <li>
         <xsl:if test="$current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1">
            <xsl:attribute name="class">active</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>
         
         <!--
         В случае, если понадобится отобразить большие уровни вложенности, верхнюю строчку закомметировать и раскомментировать следующий код:
         -->
         <!--
         <xsl:choose>
            <xsl:when  test="count(informationsystem_group) &gt; 0">
            <a href="{$link}" class="dropdown-toggle" data-toggle="dropdown" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/><b class="caret"></b></a>
               <ul class="dropdown-menu">
                  <xsl:apply-templates select="informationsystem_group[show=1]" mode="InfoSystem" />
               </ul>
            </xsl:when>
            <xsl:otherwise>
               <a href="{$link}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </xsl:otherwise>
         </xsl:choose>
         -->
         
      </li>
   </xsl:template>
</xsl:stylesheet>


И не забываем в настройках инфосистемы указать узел структуры.



#
Re: Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта
catfelix150 спасибо за рабочий код! Спустя 10 лет очень помогло.
Попытался отобразить большие уровни вложенности, закомментировав и раскомментировав где нужно, но ничего не получилось. Раскомментированный код, как я понимаю, должен работать для инфосистем. Переделал его для структуры - не работает.
В чём я не прав?

<!-- Формируем ссылку и не суемся на большие уровни вложенности.
         <a href="{$link}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
-->
         <!--
            В случае, если понадобится отобразить большие уровни вложенности, верхнюю строчку закомметировать и раскомментировать следующий код:
            -->
            
            
            <xsl:choose>
                  <xsl:when  test="count(structure) &gt; 0">
                     <a href="{$link}" class="dropdown-toggle" data-toggle="dropdown" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/><b class="caret"></b></a>
                     <ul class="dropdown-menu">
                        <xsl:apply-templates select="structure[show=1]" />
                     </ul>
                  </xsl:when>
                  <xsl:otherwise>
                     <a href="{$link}" title="{name}" hostcms:id="{@id}" hostcms:field="name" hostcms:entity="structure"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
                  </xsl:otherwise>
            </xsl:choose>
lbrstudio@mail.ru
Модератор
#
Re: Двухуровневое выпадающее меню из инфосистем и разделов структуры сайта
O`Breea,
Как минимум откройте XML и посмотрите есть ли в нем вообще подузлы structure с show=1, которые вы пытаетесь вывести.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
Авторизация