Нестандартное меню

#
Нестандартное меню
Помогите немножко доработать шаблон, из-за кривых рук и плохого знания xsl не получается довести до ума.

Шаблон (выводит первые 2 уровня групп инфосистемы)


<?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="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/document">

   <!-- Получаем ID родительской группы и записываем в переменную $parent_group_id -->
   <xsl:variable name="parent_group_id" select="blocks/parent_group_id"/>
   
   <!-- Отображение подгрупп данной группы -->
        <div class="inner-menu">
            <xsl:apply-templates select=".//group[@parent_id=0]" mode="groups"/>
        </div>

</xsl:template>

<!-- Меню первого уровня со ссылками, раскрывающими подменю -->

<xsl:template match="group" mode="groups">
        <div>
            <span class="pseudo-link" onclick="expandit(this)">
                <b><xsl:value-of disable-output-escaping="yes" select="name"/></b>
            </span>  
            <div style="display:none;">
                <xsl:apply-templates select="group" mode="groups2"/>
            </div>
        </div>
</xsl:template>

<!-- Выводим все подменю -->

<xsl:template match="group" mode="groups2">
        <div>
            <span class="link">
                <a href="{/document/blocks/url}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
            </span>
        </div>
</xsl:template>

</xsl:stylesheet>


немного модернизированный стандартный вывод списка групп

скрипт expandthis просто скрывает-показывает блок с подменю под собой

как добавить как бы проверку на активность, то есть если нажимаем на ссылку из подменю, чтобы
- этой ссылке добавлялось какое-то свойство (допустим <span class="active"> вместо <span class="link"> )
- и чтобы родительскому блоку над ним не присваивался стиль display:none;
#
Re: Нестандартное меню
Если Вы для реализации данного функционала используете JavaScript, то в XSL-шаблоне пропишите для используемых Вами div-ов идентификаторы(т.е. id), и при возникновении какого-либо события, например по клику мыши на имени группы,  обращайтесь к нужному div-ву по его идентификатору методом getElementById и изменяйте ему(через объектную модель) стиль отображения.
А вообще есть возможность реализации данного функционала без использования JavaScript. Но необходимо немного переделать XSL-шаблон.
#
Re: Нестандартное меню
так дело даже не в java, он тут в принципе никакой роли не играет, главное вот - сменить класс ссылки <span class="active"> вместо <span class="link">, если мы находимся в этой подгруппе или во вложенных, и для родительского блока - <div style=""> вместо <div style="display:none;">
а как реализовать через xsl это событие onclick и раскрытие подменю я даже представить не могу ((
#
Re: Нестандартное меню
Я же вам и говорю: есть 2 пути реализации подобного функционала. Использовать JavaScript(как Вы уже начали делать) либо полностью от него отказать и реализовать все стандартными методами XSL. Вообще использовать JavaScript в XSL-шаблоне целесообразно в случаях всевозможных выпадающих меню(т.е. когда подгруппы какой-либо группы отображаются появляющимся блоком(т.е. атрибут display меняет свое значение с "none" на "block", напрмер) при наведении(!) на ссылку, соответствующую названию данной группы). Но в Вашем случае смена стилей и показ блока подгрупп требуется при заходе(!) в группу(а не при наведении на нее мышкой), т.е. при смене текущей группы. Поэтому лучше всего отказаться от вызова всяческих скриптов, а добавить несложную проверку на XSL-ле:
<xsl:variable name="current_group_id" select="/document/blocks/parent_group_id"/>

      <xsl:choose>   
          <xsl:when test="$current_group_id = @id or count(.//group[@id=$current_group_id])=1">
            <span class="active"><b><xsl:value-of disable-output-escaping="yes" select="name"/></b></span>
  <div style="display:block;">
                <xsl:apply-templates select="group" mode="groups2"/>
            </div>
         </xsl:when>
         <xsl:otherwise>
            <span class="link"><b><a href="{/document/blocks/url}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></b></span>
         </xsl:otherwise>
      </xsl:choose>
#
Re: Нестандартное меню
теперь проблема с
<xsl:variable name="current_group_id" select="/document/blocks/parent_group_id"/>


а как передать шаблону идентификатор текущей группы при вызове?
Нашел похожую тему, только для интернет-магазина (http://hostcms.ru/forums/17/661/)
то есть /document/blocks/parent_group_id судя по всему тоже нужно заменить на какую то переменную "Текущаягруппа", которая определяется в вызове

использую стандартный вызов
<?
$InformationSystem = new InformationSystem();
$external_propertys=array();
$item_count = 100;
$InformationSystemId = 6;
$InformationGroupId = false;
$InformationSystem->ShowInformationSystem($InformationSystemId, $InformationGroupId,'Группы',$item_count,0,$external_propertys);  
?>
#
Re: Нестандартное меню
У Вас, очевидно, с помощью этого XSL-шаблона строится только навигация по группам инфосистемы и указывается он не в узле структуры для данной инфосистемы, а в макете или шаблоне страницы при вызове метода ShowInformationSystem. Поэтому значение xml-тэга <parent_group_id> вне зависимости от текущей группы будет иметь значение 0. Значит идентификатор текущей группы нужно передавать через дополнительное свойство:
$InformationSystem = new InformationSystem();
$InformationSystemId = 1;
$rez = array();
$rez = $InformationSystem->GetInformationFromPath($InformationSystemId);
$external_propertys['ТекущаяГруппа'] = $rez['group'];
$InformationSystem->ShowInformationSystem($InformationSystemId, false,'Навигация',$item_count,0,$external_propertys);

А в XSL-шаблоне:
<xsl:variable name="current_group_id" select="/document/ТекущаяГруппа"/>
#
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="/">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/document">

   <div class="items">
   <!-- Отображение записи информационного блока -->
   <xsl:apply-templates select="blocks/items/item[item_status=1" mode="group" />
   </div>

</xsl:template>

<xsl:template match="blocks/items/item" mode="group">
   <xsl:variable name="current_item_id" select="/document/ТекущийЭлемент"/>

   <xsl:choose>
      <!-- активный, ссылку не ставим -->
      <xsl:when test="$current_item_id = @id">
         <div><xsl:value-of disable-output-escaping="yes" select="item_name"/></div>
         <div><img src="/{item_small_image}" /></div>
      </xsl:when>

      <!-- остальные -->
      <xsl:otherwise>
         <div><a href="{item_path}"><xsl:value-of disable-output-escaping="yes" select="item_name"/></a></div>
         <div><a href="{item_path}"><img src="/{item_small_image}" /></a></div>
      </xsl:otherwise>
   </xsl:choose>

</xsl:template>

</xsl:stylesheet>


шаблон вызывается


$InformationSystem = new InformationSystem();
$InformationSystemId = 6;
$rez = array();
$rez = $InformationSystem->GetInformationFromPath($InformationSystemId);
$external_propertys['ТекущийЭлемент'] = $rez['group'];
$InformationSystem->ShowInformationSystem($InformationSystemId, false,'Важное',4,0,$external_propertys);


но в любом случае ссылка не удаляется, как правильно передать id элемента для проверки?
#
Re: Нестандартное меню
Вы передаете в качестве идентификатора текущего инфоэлемента идентификатор текущей группы:
$external_propertys['ТекущийЭлемент'] = $rez['group'];
Так работать, конечно, не будет.
Попробуйте так:

$InformationSystem = new InformationSystem();
$InformationSystemId = 6;
$rez = array();
$rez = $InformationSystem->GetInformationFromPath($InformationSystemId);
$rez_item = '';
$rez_item = $InformationSystem->GetIdInformationItem($rez['item'],$rez['group'],$InformationSystemId);
$external_propertys['ТекущийЭлемент'] = $rez_item;
$InformationSystem->ShowInformationSystem($InformationSystemId, false,'Важное',4,0,$external_propertys);

Не забудьте правильно обработать узел "ТекущийЭлемент" в XSL_шаблоне
#
Re: Нестандартное меню
Подскажите, пожалуйста, как с помощью XSL шаблона, на основании структуры сайта, осуществить вывод следующего кода (для выпадающего меню):

        <div class="nav2">
   
          <!-- Navigation item -->
          <ul>
            <li><a href="/">Home</a></li><!Родительская ссылка, нет дочерних -->
          </ul>
          
          <!-- Navigation item -->
          <ul>
            <li><a href="#">Page Layouts<!--[if IE 7]><!--></a><!--<![endif]--> <!Родительская ссылка-->
              <!--[if lte IE 6]><table><tr><td><![endif]-->
                <ul>
                  <li><a href="layout1">Layout-1</a></li> <!Дочерняя ссылка-->
                  <li><a href="layout2">Layout-2</a></li> <!Дочерняя ссылка-->
                  <li><a href="layout3">Layout-3</a></li> <!Дочерняя ссылка-->
                  <li><a href="layout4">Layout-4</a></li> <!Дочерняя ссылка-->
                  <li><a href="layout5">Layout-5</a></li> <!Дочерняя ссылка-->
                </ul>
              <!--[if lte IE 6]></td></tr></table></a><![endif]-->
            </li>
          </ul>          

          <!-- Navigation item -->
          <ul>
            <li><a href="#">Header Layouts<!--[if IE 7]><!--></a><!--<![endif]--> <!Родительская ссылка-->
              <!--[if lte IE 6]><table><tr><td><![endif]-->
                <ul>
                  <li><a href="header1">Header-1</a></li> <!Дочерняя ссылка-->
                  <li><a href="header2">Header-2</a></li> <!Дочерняя ссылка-->
                  <li><a href="header3">Header-3</a></li> <!Дочерняя ссылка-->
                  <li><a href="header4">Header-4</a></li> <!Дочерняя ссылка-->
                  <li><a href="header5">Header-5</a></li> <!Дочерняя ссылка-->
                  <li><a href="header6">Header-6</a></li> <!Дочерняя ссылка-->
                  <li><a href="header7">Header-7</a></li> <!Дочерняя ссылка-->
                </ul>
              <!--[if lte IE 6]></td></tr></table></a><![endif]-->
            </li>
          </ul>          

        </div>




Подскажите, что нужно добавить к стандартному шаблону вывода меню. Я тут начал, вроде как стучится мысль, ищет мозг, но не находит

<?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">
        <div class="nav2">

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

        </div>

</xsl:template>

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

   <ul>
   <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>

         <ul><li><a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></li></ul>
      </xsl:if>

      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>

        </ul>

</xsl:template>
</xsl:stylesheet>
#
Re: Нестандартное меню
Я думаю, что в Ваш XSL-шаблон нужно добавить еще один тэмплейт <xsl:template match="structure" mode="child_nodes"> для обработки узлов структуры(а также немного поправить то, что Вы уже написали), т.к. рекурсивного вызова тэмплейта <xsl:template match="structure">  для построения задуманной Вами структуры может быть недостаточно:
<?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">
        <div class="nav2">

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

        </div>

</xsl:template>

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

   <ul>
  <li>
   <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>

        <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
      </xsl:if>

      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>

<ul>
<xsl:apply-templates select="structure[show=1]" mode="child_nodes"/>
</ul>

</li>
        </ul>

</xsl:template>

<xsl:template match="structure" mode="child_nodes">
   <!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
   <xsl:variable name="current_structure_id" select="/document/structure/current_structure_id"/>
  <li>
   <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>

        <a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
      </xsl:if>

      <!-- Если не показывать ссылку - выводим просто имя ссылки -->
      <xsl:if test="show_link=0">
         <xsl:value-of disable-output-escaping="yes" select="name"/>
      </xsl:if>
</li>
</xsl:template>

</xsl:stylesheet>
Авторизация