меню из списка

#
меню из списка
Всем доброго дня.

С помощью карты сайта и скриптов пеализовал раскрывающееся меню в магазине.

В общем есть такой фрагмент в xsl меню (думаю по карте сайта многим будет знакомо):
<xsl:template match="structure">
         
         <li>
...


Надо в общем сделать что-бы если ссылка является родителем страници на которой находимся то ей присваивалось просто - <li> , иначе - <li class='closed'>. Ну или хотыбы если родитель - с пустым стилем если нет - с заданным...
тоесть сделать проверку на "родство" ссылки с текущей страницей...
#
Re: меню из списка
возможно так
<li>
<xsl:if test="not(current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1)">
<xsl:attribute name="class">closed</xsl:attribute>
</xsl:if>
...
#
Re: меню из списка
нет. предупреждение выдаёт...
пробовал также уже, только без "not(..."
#
Re: меню из списка
Это меню из списка, находиться в магазине, и надо если пользователь находится в каком либо разделе магазина, то надо этот раздел в меню развернуть...
Во многих ин-магазинах такое есть, подумал надо и тут сделать.
Потом в полезные решения вынесу
#
Re: меню из списка
видимо Undefined variable: current_structure_id

нужно передать id текущей группы через external_propertys, как в хлебных крошках

вызов меню:
<?php
   $InformationSystem = & singleton('InformationSystem');
   $InformationSystem_id = $InformationSystem->GetInformationSystemByStructureId(CURRENT_STRUCTURE_ID);
   $param = array();
   $external_propertys = array();
   if ($InformationSystem_id)
   {
      $result = $InformationSystem->GetInformationFromPath($InformationSystem_id, '', false);
      if ($result['item'])
      {
         $item_id = $InformationSystem->GetIdInformationItem($result['item'], $result['group'], $InformationSystem_id);
   
         if ($item_id != 0)
         {
            $external_propertys['item'] = $item_id;
            $param['show_items'] = array($item_id);
         }
      }
      else
      {
         $item_id = false;
      }
      if (is_array($result) && $result['group'] > 0)
      {
         $external_propertys['group'] = $result['group'];
      }
   }
   elseif (class_exists('shop'))
   {
      $shop = & singleton('shop');
      $shop_row = $shop->GetShopWhithStructureId(CURRENT_STRUCTURE_ID, CURRENT_SITE);
   
      if ($shop_row)
      {
         $result = $shop->GetItemPath($shop_row['shop_shops_id'], '', false);
         if ($result['item'])
         {
            $item_id = $result['item'];
            if ($item_id != 0)
            {
               $external_propertys['item'] = $item_id;
               $param['show_shop_items'] = array($item_id);
            }
         }
         else
         {
            $item_id = false;
         }
         if (is_array($result) && $result['group'] > 0)
         {
            $external_propertys['group'] = $result['group'];   
         }
      }
   }
   $param['show_groups'] = true;
   $param['show_shop_groups'] = true;
   $structure = & singleton('Structure');
   $structure->ShowStructure(false, 'ШаблонМеню', $param, $external_propertys);
   
   ?>


XSL:
<xsl:variable name="current_structure_id">
<xsl:choose>
<xsl:when test="/document/item/node()">item_<xsl:value-of select="/document/item"/></xsl:when>
<xsl:when test="/document/group/node()">group_<xsl:value-of select="/document/group"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="/document/structure/current_structure_id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<li>
<xsl:if test="not($current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1)">
<xsl:attribute name="class">closed</xsl:attribute>
</xsl:if>
...
#
Re: меню из списка
вызов меню не работает - пустое место кажет.

я вот так вывожу:
<?php
$Structure = & singleton('Structure');
$xsl = "ПравоеМенюМагазинаБезСтруктур";
$param = array();

/* Показывать группы информационных систем в карте сайта */
$param['show_groups'] = false;
/* Показывать элементы информационных систем в карте сайта */
$param['show_items'] = false;
/* Показывать группы магазина в карте сайта */
$param['show_shop_groups'] = true;
/* Показывать товары магазина в карте сайта */
$param['show_shop_items'] =  true;

$structure_parent_id = 330; // идентификатор узла структуры магазина
$param['parent_id'] = $structure_parent_id;
$Structure->ShowStructure(false, $xsl, $param);
?>

и в XSL меню убираю узлы структуры (так что-бы показывались только товары и разделы)
<xsl:if test="contains(@id, 'item_') = 'True' or contains(@id, 'group_') = 'True'">
#
Re: меню из списка
тоесть этот код что я вывожу нормально показывает... а
h4mpy писал(а):
как в хлебных крошках

ничего не выводит...

(для ясности...)
#
Re: меню из списка
в вашем вызове не передается id текущего товара или группы

передать можно так:
перед ShowStructure
$external_propertys = array();
   if (class_exists('shop'))
   {
      $shop = & singleton('shop');
      $shop_row = $shop->GetShopWhithStructureId(CURRENT_STRUCTURE_ID, CURRENT_SITE);
  
      if ($shop_row)
      {
         $result = $shop->GetItemPath($shop_row['shop_shops_id'], '', false);
         if ($result['item'])
         {
            $item_id = $result['item'];
            if ($item_id != 0)
            {
               $external_propertys['item'] = $item_id;
               $param['show_shop_items'] = array($item_id);
            }
         }
         else
         {
            $item_id = false;
         }
         if (is_array($result) && $result['group'] > 0)
         {
            $external_propertys['group'] = $result['group'];  
         }
      }
   }

добавить
$Structure->ShowStructure(false, $xsl, $param, $external_propertys);


и обработать в xsl
<xsl:variable name="current_structure_id">
<xsl:choose>
<xsl:when test="/document/item/node()">item_<xsl:value-of select="/document/item"/></xsl:when>
<xsl:when test="/document/group/node()">group_<xsl:value-of select="/document/group"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="/document/structure/current_structure_id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<li>
<xsl:if test="not($current_structure_id = @id or count(.//structure[@id=$current_structure_id]) = 1)">
<xsl:attribute name="class">closed</xsl:attribute>
</xsl:if>
...


+ если это меню только для магазина - можно на методе ShowShop сделать
#
Re: меню из списка
делал точно так уже, меню выводилось, вот только над меню замечание было, и список в нужном месте не раскрывался.

Сейчас попробую ещё сделать и дам текст замечания...
#
Re: меню из списка
Всё заработало (этот код у меня был ниже расположен)
h4mpy писал(а):
<xsl:variable name="current_structure_id">
<xsl:choose>
<xsl:when test="/document/item/node()">item_<xsl:value-of select="/document/item"/></xsl:when>
<xsl:when test="/document/group/node()">group_<xsl:value-of select="/document/group"/></xsl:when>
<xsl:otherwise>
<xsl:value-of select="/document/structure/current_structure_id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>


вот только если теперь заходим по меню в раздел, то в этом меню всем остальным разделам которые находятся на том-же уровне присваивается тот-же адрес (если разворачиваю эти соседние разделы то товар и разделы в них с нормальными адресами) и если нахожусь на странице товара - то вообще как-то коряво отображается (из закономерности подметил только то что открыта группа и один товар из группы - на странице которого находимся)
h4mpy писал(а):
+ если это меню только для магазина — можно на методе ShowShop сделать

да, меню только на магазине...
как тогда сделать на ShowShop?
Авторизация