Два меню с дублирующими ссылками

#
Re: Два меню с дублирующими ссылками
ну ведь они ссылаются на одну страницу и по отдельности обрабатываются правильно, а вместе ну никак не хотят.
Может есть способ при вызове (или перед вызовом) второго меню обнулить параметр, по которому проверяется обработка...
Мне кажется, что всё-таки должно быть решение.
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Модератор
#
Re: Два меню с дублирующими ссылками
EZ-Web писал(а):
ну ведь они ссылаются на одну страницу и по отдельности обрабатываются правильно, а вместе ну никак не хотят.

Включите XML и посмотрите, ID текущего узла у Вас "настоящего", а в XML для второго меню идут "ярлыки", у них абсолютно разные ID. Снаружи получайте ткущий объект структуры и через addEntity() добавляйте его путь, в XML сравнивайте не по ID, а по путям.
#
Re: Два меню с дублирующими ссылками
то есть необходимо переписать XSL шаблон для второго меню или вызов второго меню в шаблоне?
не совсем понимаю что и где нужно править...
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: Два меню с дублирующими ссылками
вызов второго меню в макете:
               <!-- Нижнее меню -->
                  <?php
                     // Нижнее меню
                     $Structure_Controller_Show = new Structure_Controller_Show(
                     Core_Entity::factory('Site', CURRENT_SITE));
                     $Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
                        ->getByName('menu_bottom'))
                        ->menu('5')
                        ->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="/site">
      <ul class="menu_bottom">
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="child::*[show=1]"/>
      </ul>
   </xsl:template>
   
   <xsl:template match="*">
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
      
      <!-- Определяем стиль вывода элемента в меню и субменю -->
      <xsl:variable name="li_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1 or count(.//structure[@id=$current_structure_id])=@id">current</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>go</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <!-- Определяем стиль вывода ссылки в меню и субменю -->
      <xsl:variable name="a_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or /site/informationsystem_group_id = @id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>passive</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <li class="{$li_style}">
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show = 1">
            <!-- Определяем адрес ссылки -->
            <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}" class="{$a_style}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
      </li>
      <!-- Выбираем подузлы структуры -->
      <xsl:if test="count(child::*[show=1]) &gt; 0">
         <!-- Выбираем узлы структуры: специально выводим подменю на одно уровне в меню -->
         <xsl:apply-templates select="child::*[show=1]"/>
      </xsl:if>
   </xsl:template>
</xsl:stylesheet>
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: Два меню с дублирующими ссылками
Если закоментить первый вывод меню, то
второй вариант работает.
Вместе - нет, только первый.

Если бы второе меню было неправильным, то и при закоментированом выводе первого меню не работало.
Ан ведь нет же! Работает!

Так что видимо это косячок в ядре...
Или мы что-то неправильно делаем.
Так подскажите что именно
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Модератор
#
Re: Два меню с дублирующими ссылками
EZ-Web писал(а):
Если закоментить первый вывод меню, то второй вариант работает.

Я вообще только вывод одного меню вижу, где второе

EZ-Web писал(а):
Так что видимо это косячок в ядре… Или мы что-то неправильно делаем.

Шикарные умозаключения
#
Re: Два меню с дублирующими ссылками
Хорошо. вот первое меню:
               <!-- Нижнее меню -->
                  <?php
                     // Верхнее меню
                     $Structure_Controller_Show = new Structure_Controller_Show(
                     Core_Entity::factory('Site', CURRENT_SITE));
                     $Structure_Controller_Show->xsl(Core_Entity::factory('Xsl')
                        ->getByName('menu_top'))
                        ->menu('4')
                        ->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="/site">
      <ul class="menu_top">
         <!-- Выбираем узлы структуры -->
         <xsl:apply-templates select="child::*[show=1]"/>
      </ul>
   </xsl:template>
  
   <xsl:template match="*">
      <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
      <xsl:variable name="current_structure_id" select="/site/current_structure_id"/>
      
      <!-- Определяем стиль вывода элемента в меню и субменю -->
      <xsl:variable name="li_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1 or count(.//structure[@id=$current_structure_id])=@id">current</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>go</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <!-- Определяем стиль вывода ссылки в меню и субменю -->
      <xsl:variable name="a_style">
         <xsl:choose>
            <!-- Выделяем текущий пункт меню (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="$current_structure_id=@id or /site/informationsystem_group_id = @id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
            <!-- Иначе обычный вывод с неактивным стилем -->
            <xsl:otherwise>passive</xsl:otherwise>
         </xsl:choose>
      </xsl:variable>
      
      <li class="{$li_style}">
         <!-- Показывать ссылку, или нет -->
         <xsl:if test="show = 1">
            <!-- Определяем адрес ссылки -->
            <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}" class="{$a_style}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </xsl:if>
      </li>
   </xsl:template>
</xsl:stylesheet>


По поводу "косячка" - косячки случаются, это не страшно, косяки - уже хуже, но вот "косячище" - это почти уровень "геморойчика" ))
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Модератор
#
Re: Два меню с дублирующими ссылками
EZ-Web,
не верю, что при выводе верхнего меню может не работать нижнее. Обратитесь в поддержку с описанием проблемы, данными доступа в ЦА и ФТП и ссылкой на тему.
#
Re: Два меню с дублирующими ссылками
оно работает, но обработка на текущий пункт меню в нижнем меню не срабатывает.
версия 6.0.6 редакция Халява. Саппорт вроде решает проблемы с платными редакциями.
Я проверил на этой же версии, но на другом хосте установлена тоже Халява - та же беда...
Видимо эта проблема встречается в Халяве и вряд ли саппорт будет всем её решать...
Или будет?
Знания имеют свои пределы, и только глупость человеческая не знает границ...
Модератор
#
Re: Два меню с дублирующими ссылками
Подождите, Вы писали выше совсем другое:
EZ-Web писал(а):
Если закоментить первый вывод меню, то второй вариант работает.
Вместе — нет, только первый.

Получается проблемы никакой и нет, просто ошибка в логике второго меню.
Авторизация