Показ подменю (еще раз)

#
Показ подменю (еще раз)
Перерыл весь форум, все решениях, какие то обрывчатые.
Собственно надо меню с показом подпунктов (из структуры), что бы подпункты показывались только при активном разделе, нашел вот такое решение:

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 method="html" indent="yes" encoding="Windows-1251"/>
<xsl:template match="/document">
<!-- Выбираем узлы структуры только 1-го уровня вложенности -->
<xsl:apply-templates select="structure[show=1]"/>
</xsl:template>
<xsl:template match="structure">
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
<xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
<!-- Показывать ссылку, или нет -->
<xsl:if test="show_link=1">
<!-- Определяем адрес ссылки -->
<xsl:variable name="link"><xsl:choose>
<!-- Если внешняя ссылка -->
<xsl:when test="is_external_link=1"><xsl:value-of disable-output-escaping="yes" select="is_external_link"/></xsl:when>
<!-- Иначе если внутренняя ссылка -->
<xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Определяем стиль вывода ссылки -->
<xsl:variable name="link_style"><xsl:choose>
<!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
<xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">active</xsl:when>
<!-- Иначе обычный вывод с пустым стилем -->
<xsl:otherwise></xsl:otherwise>
</xsl:choose></xsl:variable>
<!-- Расчитываем размер отступа -->
<xsl:variable name="padding" select="level * 15"/>
<div style="padding-left: {$padding}px;"><a href="{$link}" class="{$link_style}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></div>
</xsl:if>
<!-- Если не показывать ссылку - выводим просто имя ссылки -->
<xsl:if test="show_link=0">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</xsl:if>
<!-- Подпункты выводим только для текущего узла -->
<xsl:if test="@id = $current_structure_id">
<xsl:apply-templates select="structure"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>


Вывод структуры:

<? $Structure = new Structure(); $Structure->ShowStructure(1,'Меню'); ?>


(насколько понял, надо менять метод вывода структуры, предложенный на форуме выдает ошибки)

Все нормально, но при переходе в подраздел, ссылка в меню пропадает - как сделать чтобы ссылка оставалась?
И еще тут выделение подпунктов реализовано с помощью отступа, а могли бы сделать что бы подпункту прописывался класс?
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Показ подменю (еще раз)
Выводит меню с активным подразделом и подподразделом(с одноо из проектов своих взял).. сделал в виде картинок... а так, просто стили меняешь в нужных местах и все


<?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">
<xsl:variable name="csid" select="./structure/current_structure_id" />
<xsl:variable name="pid" select="//structure[@id=$csid]/id_parent" />
<xsl:variable name="ppid" select="//structure[@id=$pid]/id_parent" />

  <table border="0" cellpadding="0" cellspacing="0" width="898" style="height:36px; background-color:#F8F2DA;">
    <tr align="center">
      <!-- Выбираем узлы структуры -->
<xsl:choose>
  <xsl:when test="not($ppid=0) and not($pid=0)">
   <xsl:apply-templates select="structure[show=1]" mode="subsub"/>
  </xsl:when>
  <xsl:otherwise>
   <xsl:apply-templates select="structure[show=1]" mode="sub"/>
  </xsl:otherwise>
</xsl:choose>
    </tr>
  </table>

</xsl:template>

<xsl:template match="structure" mode="subsub">
  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="csid" select="/document/structure/current_structure_id"/>
  <xsl:variable name="csidb" select="//structure[@id=$csid]/id_parent"/>

  <xsl:variable name="mparent_id" select="structure[@id=$csidb]/id_parent"/>

  <xsl:variable name="mname" select="name"/>
  <xsl:variable name="link" select="link"/>
  <xsl:variable name="mlink" select="substring(link,1,string-length(link)-1)"/>

  <td>
  <xsl:choose>
  <xsl:when test="(@id=$mparent_id and not(parent_id=0)) or (@id=$csidb)">
    <img alt="{$mname}" src="/images/ieroglyf.ru/menu{$mlink}-light.gif" title="{$mname}" />
  </xsl:when>
  <xsl:otherwise>
    <a href="{$link}"><img alt="{$mname}" src="/images/ieroglyf.ru/menu{$mlink}.jpg" title="{$mname}" /></a>
  </xsl:otherwise>
  </xsl:choose>
  </td>
  <td>
<!--  <xsl:if test="not(count(/document/structure[show=1])-count(//structure/structure[show=1]) = position())">-->
  <xsl:if test="not(count(/document/structure[show=1]) = position())">
    <img src="/images/ieroglyf.ru/border.gif" alt="Палочка"/>
  </xsl:if>
  </td>

</xsl:template>

<xsl:template match="structure" mode="sub">
  <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
  <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
  <xsl:variable name="mparent_id" select="structure[@id=$current_structure_id]/id_parent"/>

  <xsl:variable name="mname" select="name"/>
  <xsl:variable name="link" select="link"/>
  <xsl:variable name="mlink" select="substring(link,1,string-length(link)-1)"/>

  <td>
  <xsl:choose>
  <xsl:when test="(@id=$mparent_id and not(parent_id=0)) or (@id=$current_structure_id)">
    <img alt="{$mname}" src="/images/ieroglyf.ru/menu{$mlink}-light.gif" title="{$mname}" />
  </xsl:when>
  <xsl:otherwise>
    <a href="{$link}"><img alt="{$mname}" src="/images/ieroglyf.ru/menu{$mlink}.jpg" title="{$mname}" /></a>
  </xsl:otherwise>
  </xsl:choose>
  </td>
  <td>
<!--  <xsl:if test="not(count(/document/structure[show=1])-count(//structure/structure[show=1]) = position())">-->
  <xsl:if test="not(count(/document/structure[show=1]) = position())">
    <img src="/images/ieroglyf.ru/border.gif" alt="Палочка"/>
  </xsl:if>
  </td>

</xsl:template>

</xsl:stylesheet>
#
Re: Показ подменю (еще раз)
Спасибо, сейчас попробую!
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Показ подменю (еще раз)
Подразделы структуры не появляются!
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Показ подменю (еще раз)
Varkolak, вот еще пример 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">

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

<xsl:template match="structure">
<li>
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
   
   <!-- Расчитываем размер отступа -->
   <xsl:variable name="padding" select="level * 10" />
   
      <!-- Показывать ссылку, или нет -->
      <xsl:if test="show_link = 1">
      
         <!-- Определяем адрес ссылки -->
         <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>
         
         <!-- Определяем стиль вывода ссылки -->
         <xsl:variable name="link_style"><xsl:choose>
            <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">font-weight: bold</xsl:when>
            <!-- Иначе обычный вывод с пустым стилем -->
            <xsl:otherwise></xsl:otherwise>
         </xsl:choose></xsl:variable>
         
         <xsl:choose>
            <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
            <a href="{$link}"><font color="#942121"><xsl:value-of disable-output-escaping="yes" select="name"/></font></a></xsl:when>
            <!-- Иначе обычный вывод с пустым стилем -->
            <xsl:otherwise>
            
            
            <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            
            
            
            </xsl:otherwise>
         </xsl:choose>
         
      </xsl:if>
      
      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>



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

   <ul>
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure"/>
      
   </ul>
</xsl:if>
   
   </xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
#
Re: Показ подменю (еще раз)
В этом случае тогда не показываются подпункты, но зато показываются разделы, на которые стоит галочка "Не отображать в меню сайта"  
#
Re: Показ подменю (еще раз)
Konan-design, поясните, пожалуйста, Ваш вопрос.
#
Re: Показ подменю (еще раз)
natalya,
Мне тоже нужно вывести  меню с показом подпунктов (из структуры), что бы подпункты показывались только при активном разделе.
Попробовал поставить Ваш XSL-шаблон, в итоге подпункты не выводятся.
И еще, у меня в структуре сайта есть несколько разделов, которые не должны выводиться (стоит галочка "Не отображать в меню сайта".
#
Re: Показ подменю (еще раз)
Что касается первого вопроса, то сообщите адрес сайта и доступ к разделу администрирования в адрес службы тех. поддержки. А по второму вопросу: необходимо внести изменения в XSL-шаблон:
...
<xsl:template match="/document">

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

   <ul>
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure[show=1]"/>
      
   </ul>
</xsl:if>
#
Re: Показ подменю (еще раз)
Отправил
Авторизация