Древовидный вывод груп товаров

#
Древовидный вывод груп товаров
Можно ли организовать вывод категорий товаров интернет магазина в отдельный блок в виде дерева.
Если да, то как? Думаю это было бы интересно многим пользователям.
Суть данного метода в организации каталога на базе интернет магазина с более нагрядной навигацией.
Делаю мэйк-ап сайтов
#
Re: Древовидный вывод груп товаров
В XSL-шаблоне, занимающемся отображением списка категорий интернет-магазина, можно исправить вызов тэмплейта для групп магазина следующим образом:

<!-- Выводим группы магазина -->
<ul>
   <xsl:apply-templates select="//group[@parent=0]"/>         
</ul>


А сам тэмплейт отображения групп и всех их подгрупп должен быть, например, таким:

<!-- Шаблон для групп товара -->
<xsl:template match="group">
   <li>
      <xsl:if test="small_image != ''">
         <img src="{small_image}" align="left" style="border: 1px solid #000000; float: left" />
      </xsl:if>
      <a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="description"/>
   </li>
      <ul>   
         <xsl:apply-templates select="group"/>
                </ul>
</xsl:template>
#
Re: Древовидный вывод груп товаров
Спасибо за ответ, но я наверное не совсем верно выразился.
Хочу сделать вывод групп товаров в виде отдельного меню в шаблоне страницы. Тоесть сделать отдельное меню для навигации по группам и подгруппам товаров магазина.

например как здесь у меня организовано левое меню http://sliderweb.ru/explore/smsend/. точно так же хочу организовать и вывод групп магазинов в отдельном блоке шаблона.

Заранее спасибо.
Делаю мэйк-ап сайтов
#
Re: Древовидный вывод груп товаров
Создайте новый XSL-шаблон на базе шаблона "МагазинКаталогТовара". Назовите его, например, "МагазинКаталогТоваровГруппы". Уберите из него все лишнее (т.е. показ блока сравнения товаров, фильтра, сортировки товаров и списка товаров - удаляйте все это внимательно и следите, чтобы не возникли ошибки при преобразовании). Оставьте только вызов тэмплейта:

   <xsl:variable name="parent_group_id" select="@current_group_id"/>
   <!-- Выводим группы магазина -->
        <ul>
               <xsl:apply-templates select="//group[@parent=0]"/>        
        </ul>


и сам тэмплейт:

<!-- Шаблон для групп товара -->
<xsl:template match="group">
   <li>
      <xsl:if test="small_image != ''">
         <img src="{small_image}" align="left" style="border: 1px solid #000000; float: left" />
      </xsl:if>
      <a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="description"/>
   </li>
      <ul>  
         <xsl:apply-templates select="group"/>
                </ul>
</xsl:template>


А в отдельном блоке шаблона страницы (или в макете) для вывода групп и их подгрупп добавьте блок:

<?
     $shop = new shop();
   $shop->ShowShop(1,'МагазинКаталогТоваровГруппы');
  ?>
#
Re: Древовидный вывод груп товаров
Либо я чего-то не понимаю, либо где-то закралась ошибка...
Сдклал как вы и написали, но у меня в итоге ПУСТО. Ошибок не выдает.
Вот XSL-код

<!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 select="shop"/>
</xsl:template>

   <xsl:variable name="parent_group_id" select="@current_group_id"/>
   <!-- Выводим группы магазина -->
        <ul>
               <xsl:apply-templates select="//group[@parent=0]"/>        
        </ul>
   <!-- Шаблон для групп товара -->
<xsl:template match="group">
   <li>
      <xsl:if test="small_image != ''">
         <img src="{small_image}" align="left" style="border: 1px solid #000000; float: left" />
      </xsl:if>
      <a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="description"/>
   </li>
      <ul>  
         <xsl:apply-templates select="group"/>
                </ul>
</xsl:template>
</xsl:stylesheet>
Делаю мэйк-ап сайтов
#
Re: Древовидный вывод груп товаров
Не выводит ничего потому, что у Вас грубейшая ошибка. Я Вам писала:

Создайте новый XSL-шаблон ... Уберите из него все лишнее

Но это же не означало убрать абсолютно все, нарушив при этом синтаксис XSL-шаблонов! У Вас блок:

<xsl:variable name="parent_group_id" select="@current_group_id"/>
   <!-- Выводим группы магазина -->
        <ul>
               <xsl:apply-templates select="//group[@parent=0]"/>        
        </ul>

вообще не является частью ни одного тэмплайта(шаблона т.е.). В XSL так делать нельзя. Попробуйте так:

<?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 select="shop"/>
</xsl:template>

<!-- Шаблон для магазина -->
<xsl:template match="/shop">
<xsl:variable name="parent_group_id" select="@current_group_id"/>
   <!-- Выводим группы магазина -->
        <ul>
               <xsl:apply-templates select="//group[@parent=0]"/>        
        </ul>
</xsl:template>


<!-- Шаблон для групп товара -->
<xsl:template match="group">
   <li>
      <xsl:if test="small_image != ''">
         <img src="{small_image}" align="left" style="border: 1px solid #000000; float: left" />
      </xsl:if>
      <a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
      <br/>
      <xsl:value-of disable-output-escaping="yes" select="description"/>
   </li>
      <ul>  
         <xsl:apply-templates select="group"/>
                </ul>
</xsl:template>

</xsl:stylesheet>
#
Re: Древовидный вывод груп товаров
Спасибо за ответ. Оченб помогли, теперь есть возможность переделать много менюшек... на базе подобных тем даже удалось немного разобраться в XSL.
Но у меня еще один вопрос. Не судите строго, я только учусь и поэтому еще нет полного понимания работы данной технологии.
Данным шаблоном рекруссивно выводятся ВСЕ группы и подгруппы товаров, но у меня каталог с множеством подгрупп и поэтому меню выглядит очень длинным и громоздким. Хотелось бы сделать раскрывющиеся подгруппы.
Пример.

Группа1
Группа2
Группа3

ппосле перехода в Группа2 получаем что-то похожее на

Группа1
Группа2
      Подгруппа1
      Подгруппа2
      Подгруппа N
Группа3

ппосле перехода в Подгруппа2 получаем что-то похожее на
Группа1
Группа2
      Подгруппа1
      Подгруппа2
             Подгруппа2-1
             Подгруппа2-2
             Подгруппа2-3
      Подгруппа N
Группа3

ну и тому подобное...
Но не знаю как такое реализовать. На основе меню удалось сделать такое, благо на форуме есть подобный пример, а вот с магазином таку не выходит. Если кто делал нечто подобное - помогите новичку.
Делаю мэйк-ап сайтов
#
Re: Древовидный вывод груп товаров
Для реализации подобного функцианала требуется модернизация XSL-шаблона следующим образом:
<?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 select="shop"/>
</xsl:template>

<!-- Шаблон для магазина -->
<xsl:template match="/shop">
<xsl:variable name="parent_group_id" select="@current_group_id"/>
   <!-- Выводим группы магазина -->
        <ul>
               <xsl:apply-templates select="//group[@parent=0]"/>        
        </ul>
</xsl:template>

<!-- Шаблон для групп товара -->
<xsl:template match="group">

   <xsl:variable name="current_group_id" select="/shop/ТекущаяГруппа"/>
   
   <li>
   <xsl:if test="small_image != ''">
      <img src="{small_image}" align="left" style="border: 1px solid #000000; float: left" />
         </xsl:if>
   <xsl:choose>   
           <xsl:when test="$current_group_id = @id or count(.//group[@id=$current_group_id])=1">
            <b><a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a></b>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
            <br/>
            <ul>
                  <xsl:apply-templates select="group"/>
            </ul>
         </xsl:when>
         <xsl:otherwise>
            <a href="{/shop/path}{fullpath}"><xsl:value-of disable-output-escaping="yes" select="name"/></a>&#160;<span style="color: #aaaaaa">(<xsl:value-of disable-output-escaping="yes" select="count_all_items"/> )</span>
         </xsl:otherwise>
      </xsl:choose>
       
      <br/>
      
      <xsl:value-of disable-output-escaping="yes" select="description"/>
      
   </li>
      
</xsl:template>

</xsl:stylesheet>


Но главное, в макете (или шаблоне страницы), в коде вызова показа данной структуры необходимо передавать идентификатор текущей группы магазина следующим образом:
<?
   $shop = new shop();
   $ShopId = 3;
   $rez = array();
   $rez = $shop->GetItemPath($ShopId);
   $external_propertys = array();
   $external_propertys['ТекущаяГруппа'] = $rez['group'];
   $xsl_catalog = 'МагазинКаталогТоваровНаГлавной';
   $shop->ShowShop($ShopId, $xsl_catalog, array('current_group_id' => 0, 'items_on_page' => 0, 'xml_show_group_type' => 'all'), $external_propertys);
?>

Где в качестве значения $ShopId подставите идентификатор своего магазина и $xsl_catalog - имя XSL-шаблона(его код привиден выше)
#
Re: Древовидный вывод груп товаров
а как сделать проверку на количество подгрупп?

Группа1
Группа2
      Подгруппа1
      Подгруппа2
      Подгруппа N
Группа3

Если мы переходим в подгруппу 2 и у нее нет подгрупп под ней просто появляется пустой <ul></ul>
как сделать вывод подгрупп только в случае если они есть?
#
Re: Древовидный вывод груп товаров
Нужно добавить проверку на количесво всех подгрупп данной группы:
<xsl:if test="count_all_groups > 0">
<ul>
                  <xsl:apply-templates select="group"/>
</ul>
</xsl:if>
Авторизация