UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: niakriss от 11 Сентября 2012, 19:19:50

Название: главное меню..
Отправлено: niakriss от 11 Сентября 2012, 19:19:50
есть шаблон меню...

<xsl:output indent="no" />

  <!-- шаблон для всего меню  -->
  <xsl:template match="udata[@module = 'content'][@method = 'menu']" mode="menu">
<div class="main-menu">
        <ul>
        <xsl:apply-templates select="items/item" mode="menu"/>
            </ul>
        </div>
  </xsl:template>

  <!-- Пункт меню -->
  <xsl:template match="item" mode="menu">

<xsl:variable name="item" select="document(concat('udata://content/menu/notemplate/1/', @id))/udata/items/item"  />

<xsl:choose>
<xsl:when test="$item">
<!-- Ссылка -->
        <xsl:apply-templates select="." mode="menu_link"/>
<xsl:apply-templates select="." mode="menu_sub"/>
</xsl:when>
<xsl:otherwise>
<!-- Ссылка -->
        <xsl:apply-templates select="." mode="menu_link"/>
</xsl:otherwise>
</xsl:choose>
       

  </xsl:template>
 

  <!-- Пункт меню (активный) -->
  <xsl:template match="item[@status = 'active']" mode="menu">

<xsl:variable name="item" select="document(concat('udata://content/menu/notemplate/1/', @id))/udata/items/item"  />

<xsl:choose>
<xsl:when test="$item">
<!-- Ссылка -->
        <li class="current expandable"><xsl:apply-templates select="." mode="menu_link"/><xsl:apply-templates select="." mode="menu_sub"/></li>
</xsl:when>
<xsl:otherwise>
<!-- Ссылка -->
        <xsl:apply-templates select="." mode="menu_link"/>
</xsl:otherwise>
</xsl:choose>
 
  </xsl:template>
 
  <!-- Вложенные пункты -->
  <xsl:template match="item" mode="menu_sub">
 
  <xsl:variable name="item" select="document(concat('udata://content/menu/notemplate/1/', @id))/udata/items/item"  />

        <xsl:if test="$item">
       
        <ul>
        <xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata" mode="menu_sub" />
        </ul>
       
        </xsl:if>
       
  </xsl:template>
 
  <!-- Подпункты -->
  <xsl:template match="udata" mode="menu_sub">
  <!-- Ссылка -->
        <xsl:apply-templates select="items/item" mode="menu_link"/>
  </xsl:template>
 
  <!-- Ссылка -->
  <xsl:template match="item" mode="menu_link">

     <!-- Определение ссылки -->
    <xsl:variable name="is_submenu_link" select="document(concat('upage://', @id, '.submenu_link'))//value" />
    <xsl:variable name="outer_link" select="document(concat('upage://', @id, '.ssylka'))//value" />
    <xsl:variable name="outer_link_blank" select="document(concat('upage://', @id, '.v_novom_okne'))//value" />
   

    <xsl:choose>
    <!-- Если введен url -->
    <xsl:when test="$outer_link != ''">
   
<xsl:choose>
<!-- Если в новом окне -->
    <xsl:when test="$outer_link_blank = 1" >
<a umi:element-id="{@id}" umi:field-name="h1" href="{$outer_link}" target="_blank" ><xsl:value-of select="@name"/></a>
    </xsl:when>
    <!-- В текущем окне -->
    <xsl:otherwise>
<li id="b"><a umi:element-id="{@id}" umi:field-name="h1" href="{$outer_link}"><xsl:value-of select="@name"/></a></li>
    </xsl:otherwise>
    </xsl:choose>
   
    </xsl:when>
    <xsl:otherwise>
    <xsl:choose>
    <!-- Если ссылка на дочернюю страницу -->
    <xsl:when test="$is_submenu_link = 1" >
<li id="c"> <a umi:element-id="{@id}" umi:field-name="h1" href="{document(concat('udata://content/menu/0/1/', @id))/udata/items/item[1]/@link}" ><xsl:value-of select="@name"/></a></li>
    </xsl:when>
    <!-- Обычная ссылка -->
    <xsl:otherwise>
<li id="d"><a umi:element-id="{@id}" umi:field-name="h1" href="{@link}" ><xsl:value-of select="@name"/></a></li>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

он выводит так:
<div xmlns="" class="main-menu">
<ul>
   <li id="d"/>
   <ul/>
   <li id="d"/>
   <ul>
      <li id="d"/>
      <li id="d"/>
   </ul>
   <li id="d"/>
   <ul/>
</ul>
</div>

а мне надо чтоб <ul> был в <li>
т.е. так:

<div class="main-menu">
   <ul>
      <li id="d">
         <ul/>
      </li>
      <li id="d">
         <ul>
            <li id="d"/>
            <li id="d"/>
         </ul>
      </li>
      <li id="d">
         </ul>
      </li>
</div>
Название: Re:главное меню..
Отправлено: admin от 12 Сентября 2012, 17:26:25
для начала скажу что использовать повторный вызом макроса udata://content/menu для вывода подпунктов это не совсем рационально (если конечно перед вами не стояла какая-то особенная задача), для этого есть параметр который указывает сколько уровней меню выводить.

Для начала, попробуйте повторить описанные специально для данного случая инструкции на сайте официальной документации http://help-dev.umi-cms.ru/chapter.MenuWithXSLT.multilevel.html

Если не получиться пишите, поможем  ;)
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 09:47:58
я сделала все как там написано... но он мне выводит только подпункты активного меню... хоть я и прописываю строку которую там говорят... вот:

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  <!-- шаблон для ВСЕХ активных пунктов меню -->

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <span>
         <xsl:value-of select="@name"/>
       </span>
       <xsl:apply-templates select="items" mode="menu"/>
    </li>
  </xsl:template>

  <!-- шаблон для ВСЕХ неактивных пунктов меню, а также для ВСЕХ пунктов, являющихся родительскими для текущей страницы -->

  <xsl:template match="item|item[.//item[@status = 'active']]" mode="menu">
    <li>
       <a href="{@link}">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="menu"/><!--Эта строка я так понимаю для того, чтоб подпункты выводились... Но в неактивном меню они все равно не выводятся(((-->
    </li>
  </xsl:template>
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 10:00:59
и мне еще надо чтоб только второй уровень выводил... у меня получилось только чтоб все.. вот этот код работает нормально... выводит во всех и активных и неактивных.. но выводит абсолютно все уровни.. а мне тока второй надо..
 <xsl:template match="udata[@module = 'content'][@method = 'menu']">
    <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
    </ul>
  </xsl:template>

  <!-- шаблон для ВСЕХ неактивных пунктов меню -->

  <xsl:template match="item" mode="menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
      <!-- удалите этот вызов, если нужно отображать подстраницы только для активных пунктов меню -->
      <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>

  <!-- шаблон для ВСЕХ активных пунктов меню -->

  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}" class="active">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="document(concat('udata://content/menu/0/1/', @id))/udata[items/item]"/>
    </li>
  </xsl:template>
Название: Re:главное меню..
Отправлено: admin от 13 Сентября 2012, 11:38:46
у вас получилось все в кучу

вызов вот такой
 <xsl:apply-templates select="document('udata://content/menu/0/3')/udata" />

шаблоны для меню вот такие
<!-- шаблон для всего меню -->

  <xsl:template match="udata[@module = 'content'][@method = 'menu']">
      <xsl:apply-templates select="items" mode="menu"/>
  </xsl:template>

  <!-- шаблон для начала всех списков -->

  <xsl:template match="items" mode="menu">
    <ul>
      <xsl:apply-templates select="item" mode="menu"/>
    </ul>
  </xsl:template>

  <!-- шаблон для ВСЕХ неактивных пунктов меню -->
  <xsl:template match="item" mode="menu" />

  <!-- шаблон для ВСЕХ активных пунктов меню -->
  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <xsl:apply-templates select="items" mode="sub_menu"/>
    </li>
  </xsl:template>


<!-- шаблон для начала списков меню второго и последующих уровней-->
<xsl:template match="items" mode="sub_menu">
    <ul class="sub_menu">
      <xsl:apply-templates select="item" mode="sub_menu"/>
    </ul>
  </xsl:template>

<!-- шаблон для неактивных пунктов меню второго и последующих уровней-->
<xsl:template match="item" mode="sub_menu">
    <li>
      <a href="{@link}">
        <xsl:value-of select="@name"/>
      </a>
        <xsl:apply-templates select="items" mode="sub_menu"/>
       </li>
  </xsl:template>

  <!-- шаблон дляактивных пунктов меню второго и последующих уровней -->
  <xsl:template match="item[@status = 'active']" mode="menu">
    <li>
       <a href="{@link}" class="active">
         <xsl:value-of select="@name"/>
       </a>
       <xsl:apply-templates select="items" mode="sub_menu"/>
    </li>
  </xsl:template>

в итоге у вас выведультся только вторые и так далее уровни меню у активного пункта меню 1 уровня
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 12:04:55
но мне то надо чтоб выводились все пункты меню до 2 уровня...
а так по вашему предложению получается выводится толко активынй пункт меню с его вторым уровнем... и все..(
Название: Re:главное меню..
Отправлено: admin от 13 Сентября 2012, 12:07:40
Цитировать
и мне еще надо чтоб только второй уровень выводил... у меня получилось только чтоб все.. вот этот код работает нормально... выводит во всех и активных и неактивных.. но выводит абсолютно все уровни.. а мне тока второй надо..

сформулируйте точно что вам надо, а лучше разберите по кусочкам приведенный код, так как макрос меню один из самых распространенных и если вы его поймете и освоите, то вам будет проще постигать другие вещи
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 12:43:23
короче мудрила мудрила я и вымудрила)))
добавила в админке поле-флаг Ссылка на подменю(submenu_link) и поставила условие.. получилось вот это:
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

<!-- активный пункт меню -->
<xsl:template match="item[@status = 'active']" mode="menu">
<xsl:variable name="is_submenu_link" select="document(concat('upage://', @id, '.submenu_link'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link">
  <li id="a">
     <a href="{@link}" class="active">
       <span><xsl:value-of select="@name" disable-output-escaping="yes"/></span>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
  </li>
  </xsl:when>
<xsl:otherwise>
 <li id="b">
     <a href="{@link}" class="active">
       <xsl:value-of select="@name" disable-output-escaping="yes"/>
     </a>
  </li>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>

<!-- неактивный пункт меню -->
<xsl:template match="item" mode="menu">
<xsl:variable name="is_submenu_link" select="document(concat('upage://', @id, '.submenu_link'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link">
  <li id="a">
     <a href="{@link}">
       <span><xsl:value-of select="@name" disable-output-escaping="yes"/></span>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
  </li>
  </xsl:when>
<xsl:otherwise>
 <li id="b">
     <a href="{@link}">
       <xsl:value-of select="@name" disable-output-escaping="yes"/>
     </a>
  </li>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>
Название: Re:главное меню..
Отправлено: admin от 13 Сентября 2012, 12:52:45
в итоге получилось?
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 13:01:21
да)) то что доктор прописал)))
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 20:56:21
блин... опять у меня вопрос((( вконце меню почему то какой то нолик выводится.. не могу понять к чему это...
Название: Re:главное меню..
Отправлено: admin от 13 Сентября 2012, 21:40:50
покажите свой шаблон и вызов макроса
Название: Re:главное меню..
Отправлено: niakriss от 13 Сентября 2012, 22:34:18
вот шаблон:
<xsl:template match="udata[@module = 'content'][@method = 'menu']">
  <ul>
      <xsl:apply-templates select="items/item" mode="menu"/>
  </ul>
</xsl:template>

<!-- активный пункт меню -->
<xsl:template match="item[@status = 'active']" mode="menu">
<xsl:variable name="is_submenu_link" select="document(concat('upage://', @id, '.submenu_link'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link">
  <li id="a">
     <a href="{@link}" class="active">
       <span><xsl:value-of select="@name" disable-output-escaping="yes"/></span>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
  </li>
  </xsl:when>
<xsl:otherwise>
  <li id="b">
     <a href="{@link}" class="active">
       <xsl:value-of select="@name" disable-output-escaping="yes"/>
     </a>
  </li>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>

<!-- неактивный пункт меню -->
<xsl:template match="item" mode="menu">
<xsl:variable name="is_submenu_link" select="document(concat('upage://', @id, '.submenu_link'))//value" />
<xsl:choose>
<xsl:when test="$is_submenu_link">
  <li id="a">
     <a href="{@link}">
       <span><xsl:value-of select="@name" disable-output-escaping="yes"/></span>
     </a>
     <xsl:apply-templates select="document(concat('udata://content/menu/notemplate/1/', @id))/udata[items/item]"/>
  </li>
  </xsl:when>
<xsl:otherwise>
  <li id="b">
     <a href="{@link}">
       <xsl:value-of select="@name" disable-output-escaping="yes"/>
     </a>
  </li>
  </xsl:otherwise>
</xsl:choose>

</xsl:template>

это вызов:

<xsl:apply-templates select="document('udata://content/menu/0/2')/udata/items" mode="menu"/>
Название: Re:главное меню..
Отправлено: admin от 14 Сентября 2012, 01:12:30
вызов обращается к элементам /udata/items

и нет ни одного шаблона у которого бы был match для данного элемента.

Всю мешанину не стал разбирать, но как минимум вам надо поменять вызов на

<xsl:apply-templates select="document('udata://content/menu/0/2')/udata" />
Название: Re:главное меню..
Отправлено: niakriss от 14 Сентября 2012, 10:20:56
так... 0 чудесным образом исчез... теперь вопрос как сделать так чтоб между активынми и неактивными ссылками не было пробела... т.е. не <li>Неактивная ссылка</li> <li>Активная ссылка</li> а <li>Неактивная ссылка</li><li>Активная ссылка</li>
Название: Re:главное меню..
Отправлено: niakriss от 14 Сентября 2012, 14:41:36
проблема решена