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

#
Re: Показ подменю (еще раз)
natalya, подпункты действительно не выводятся, может в шаблоне как то иначе выводить надо, а не так:
<? $Structure = new Structure(); $Structure->ShowStructure(1,'Меню'); ?>
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Показ подменю (еще раз)
Спасибо, проблема решена.

Varkolak,
Если больше одного подпункта, то они прекрасно выводятся.
#
Re: Показ подменю (еще раз)
Приведи пример XML файла своего, а то может что-то не ты мы советуем
#
Re: Показ подменю (еще раз)
Да, конечно, если у пункта меню был только один подпункт, то он не выводился из-за проверки:
<xsl:if test="count(structure[show=1]) > 1">

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

Логичнее исправить на <xsl:if test="count(structure[show=1]) > 0">...
#
Re: Показ подменю (еще раз)
Alvein


<?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 class="link">
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure[show=1]"/>
   </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:choose>
            <!-- Выделяем текущую страницу жирным (если это текущая страница, либо у нее есть ребенок с ID, равным текущей) -->
            <xsl:when test="current_structure_id=@id or count(.//structure[@id=$current_structure_id])=1">
            <a href="{$link}"><strong><xsl:value-of disable-output-escaping="yes" select="name"/></strong></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 class="link2">
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure"/>
      
   </ul>
</xsl:if>
  
   </xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>


Может заодно подскажете, как в этом шаблоне сделать что бы активная ссылка была простым текстом?
#
Re: Показ подменю (еще раз)
Konan-design,
нееее... мне нужен xml, а не xsl файл..
#
Re: Показ подменю (еще раз)
natalya писал(а):

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

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


Получается, тут sructure используется для вывода меню 1 уровня, затем используется для вывода еще раз, но уже подменю.

У меня просто по коду получается, что стили уже заданы 1 структуре, и если я вывожу 2 уровень, то он так же отображается как меню 1 уровня. Как можно измнить код, чтобы присвоить класс для подменю?
#
Re: Показ подменю (еще раз)
Ответ нашел в начале темы:

К выводу нужно добавить приставку mode="sub",
<xsl:apply-templates select="structure" mode="sub"/>


И создать шаблон для "sub"

<xsl:template match="structure" mode="sub">
<li>
  <!-- Запишем в константу 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)"/>


<xsl:if test="@id != $current_structure_id">
<a href="{$link}" title="{name}" style="font-size: 12.5px; text-decoration: none; padding-left: 10px; color: #2c2c2c;" >
<xsl:value-of disable-output-escaping="yes" select="name"/> </a>
</xsl:if>

<xsl:if test="@id = $current_structure_id">
<a href="{$link}" title="{name}" style="font-size: 12.5px; text-decoration: none; padding-left: 10px; color: red" >
<xsl:value-of disable-output-escaping="yes" select="name"/> </a>
</xsl:if>
</xsl:if>
</li>
</xsl:template>



Только единственное, что работает это почему-то только с переменными, которые заявленны автором кода, если убираю...

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


...код почему-то выдает ошибки!

Кто знает, может объяснит?
#
Re: Показ подменю (еще раз)
Решение, аналогичное рассматриваемому выше.
Работает на реальном проекте.
Надо было создать такую структуру:
<ul>
   <li class="menu_item">
        <ul>
           <li>
           <li>
        </ul>
   </li>
   <li class="menu_item">  
   </li>
</ul>

То есть определенный класс присваивается только пунктам списка самого верхнего уровня.
В этой ветке нашел решение:
<!-- Шаблон для групп товара -->
<!--Создаем правило, что для пунктов списка самого верхнего уровня присваивается класс menu_item -->
<xsl:template match="group">
      <li class="menu_item">
      <a href="{/shop/path}{fullpath}">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </a>
   <!-- Если есть подгруппы -->
      <xsl:if test="group">
         <ul>
                             <xsl:apply-templates select="group" mode="sub"/>
         </ul>
      </xsl:if>
   </li>
</xsl:template>
<!-- Описываем правило для пунктов всех вложенных списков-->
<xsl:template match="group" mode="sub">
   <li>
      <a href="{/shop/path}{fullpath}">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </a>
   </li>
</xsl:template>
Авторизация