Проверка в меню

#
Проверка в меню
есть самое простое меню

<?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[show=1]"/>
</ul>
   
</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="external_link"/></xsl:when>
         <!-- Иначе если внутренняя ссылка -->
         <xsl:otherwise><xsl:value-of disable-output-escaping="yes" select="link"/></xsl:otherwise>
         </xsl:choose></xsl:variable>


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

      </xsl:if>

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

</xsl:template>

</xsl:stylesheet>


как можно модернизировать проверку? то есть нужно чтобы, находясь в нужном пункте меню, этот пункт становился неактивным, если дальнейшая подструктура состоит из статических страниц все нормально, но если за этим пунктом скрывается инф. система или интернет магазин, и если забредем куда то в дебри этой системы (магазина) ссылка остается неактивной. Что можно сделать?
#
Re: Проверка в меню
Т.е., получается, что текущий узел структуры не нужно раскрывать, даже если у него есть подузлы, но они являются статичными страницами? И в любом случае ссылка на текущий узел неактивна? Если можно, приведите пример структуры.
#
Re: Проверка в меню
структура сайта такая

О компании
     Руководство
     История
     Партнеры
Новости
Интернет-магазин
...
Контактная информация

в меню выводятся только разделы, без подразделов (О компании, Новости, Интернет-магазин)

находясь допустим в подразделе Руководство (создан в структуре сайта), раздел О компании становится вновь активным,
но находясь где нибудь в разделе Новости или глубоко в Интернет-магазине, в меню ссылки остаются неактивными
#
Re: Проверка в меню
Вчера только решал эту проблему..

Для меню и подменю использовал два разных шаблона..

Шаблон для меню:

<xsl:template match="/document">

  <table bgcolor="#F8F2DA" border="0" cellpadding="0" cellspacing="0" height="36" width="898">
    <tr align="center">
      <!-- Выбираем узлы структуры -->
      <xsl:apply-templates select="structure[show=1]"/>
    </tr>
  </table>

</xsl:template>

<xsl:template match="structure">
  <!-- Запишем в константу 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}" border="0" src="/images/ie/menu{$mlink}-light.gif" title="{$mname}" />
  </xsl:when>
  <xsl:otherwise>
    <a href="{$link}"><img alt="{$mname}" border="0" src="/images/ie/menu{$mlink}.jpg" title="{$mname}" /></a>
  </xsl:otherwise>
  </xsl:choose>
  </td>
  <td>
  <xsl:if test="not(count(//structure)-count(//structure/structure) = position())">
    <img border="0" src="/images/ie/border.gif" />
  </xsl:if>
  </td>

</xsl:template>


Для подменю

<xsl:template match="/document">

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

</xsl:template>

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

  <xsl:if test="(id_parent=$mparent_id) or (id_parent=$sparent_id)">
    <xsl:if test="position() = 1">
      <xsl:text disable-output-escaping="yes">
        &lt;tr&gt;
      </xsl:text>
    </xsl:if>

    <td align="left"><div class="submenu_item">
    <xsl:if test="not($csid=@id)">
      <a href="{$mlink}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>
    </xsl:if>
    <xsl:if test="$csid=@id">
      <xsl:value-of disable-output-escaping="yes" select="name"/>
    </xsl:if>
    </div></td>

    <xsl:if test="(position() mod 3)=0">
      <xsl:text disable-output-escaping="yes">
        &lt;/tr&gt;
        &lt;tr&gt;
      </xsl:text>
    </xsl:if>

    <xsl:if test="position() = count(//structure/structure[id_parent=$mparent_id])">
      <xsl:text disable-output-escaping="yes">
       &lt;/tr&gt;
      </xsl:text>
    </xsl:if>
  </xsl:if>

</xsl:template>


Понимаю, что сделано через попу, но вроде как даже работает.. ))) Кто знает как упростить - всегда буду рад услышанному
#
Re: Проверка в меню
h4mpy, при выводе меню из макета сайта необходимо добавить блок, в котором будут определяться значения идентификаторов текущей группы ИС, текущего элемента ИС, текущей группы магазина и текущего товара магазина. Это делается потому, что по умолчанию, при нахождении где-нибудь глубоко в магазине или в ИС в XML-коде в качестве значения узла current_structure_id будет находиться идентификатор узла магазина или ИС, а не идентификатор текущей группы или элемента. Вот пример блока. Вам необходимо подставить Ваши значения для $InformationSystemId и $shop_id:
<?
/* Выводим меню на основе структуры */
$param = array();
$InformationSystem = new InformationSystem();
$InformationSystemId = 1;
$arr = array();
$arr = $InformationSystem->GetInformationFromPath(1);
$rez_item = false;
$rez_item = $InformationSystem->GetIdInformationItem($arr['item'],$arr['group'],$InformationSystemId);
$external_propertys = array();
if($arr['group'] != false && $arr['group'] != 0)
{
$external_propertys['ТекущаяГруппа'] = $arr['group'];
};
if($rez_item != false)
{
$external_propertys['ТекущийЭлемент'] = $rez_item;
};

$shop = new shop();
$shop_id = 2;

$mas = $shop->GetItemPath($shop_id);

if($mas['group'] != false && $mas['group'] != 0)
{
$external_propertys['ТекущаяГруппа'] = $mas['group'];
};
if($mas['item'] != false)
{
$external_propertys['ТекущийЭлемент'] = $mas['item'];
};

$Structure->ShowStructure(1,'ЦентральноеМеню', $param, $external_propertys);
?>

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

Необходимо:
<!-- Запишем в константу ID структуры, данные для которой будут выводиться пользователю -->
<xsl:variable name="current_structure_id"><xsl:choose>
      <xsl:when test="/document/ТекущийЭлемент/node()">item_<xsl:value-of select="/document/ТекущийЭлемент"/></xsl:when>
      <xsl:when test="/document/ТекущаяГруппа/node()">group_<xsl:value-of select="/document/ТекущаяГруппа"/></xsl:when>
      <xsl:otherwise><xsl:value-of select="/document/structure/current_structure_id"/></xsl:otherwise>
   </xsl:choose></xsl:variable>

И еще важно замечание. Вместо:
<xsl:if test="current_structure_id=@id"><li><xsl:value-of disable-output-escaping="yes" select="name"/></li></xsl:if>
<xsl:if test="current_structure_id!=@id"><li><a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></li></xsl:if>

следует использовать:
<xsl:if test="$current_structure_id=@id"><li><xsl:value-of disable-output-escaping="yes" select="name"/></li></xsl:if>
<xsl:if test="$current_structure_id!=@id"><li><a href="{$link}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></li></xsl:if>
#
Re: Проверка в меню
теперь возникла еще одна проблема
как быть если в меню не одна инф. система
можно ли ее идентификатор определить в вызове? не указывать жестко
указанный жестко работает соответственно только в одной инф.системе
#
Re: Проверка в меню
Такой метод есть, но реализован он был недавно, поэтому необходимо обновить файл класса инфосистем(можете запросить в тех .поддержке). Метод называется GetInformationSystemByStructureId. Пример использования:
$InformationSystem = new InformationSystem();
/*Определяем информацию об информационной системе, связанной с текущим узлом*/
$InformationSystemId = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);
Авторизация