Вывод товаров из подгрупп, фильтрация - решения в одном месте

#
Вывод товаров из подгрупп, фильтрация - решения в одном месте
Здравствуйте!

На форуме очень много тем про подгруппы, но в одном месте нет общего решения, лишь куски.

Моя задача:
Есть структура
Группа
-Подгруппа 1
--товары подгруппы 1
-Подгруппа 2
--товары подгруппы 2
-Подгруппа 3
--товары подгруппы 3

Мне нужно сделать на странице группы точно такой же вывод - подгруппа, а в ней товары подгруппы,
а также фильтр по параметрам товаров подгрупп - чтобы в результате было так:

Группа
-Подгруппа 1
--отфильтрованные товары подгруппы 1
-Подгруппа 2
--отфильтрованные товары подгруппы 2
-Подгруппа 3
--товары подгруппы 3
- не попало в фильтр

Если конкретно, то каталог такой
Настенные котлы
-Baxi MAIN Four
--Baxi MAIN Four 18 F (мощность 18 кВт)
--Baxi MAIN Four 24 (мощность 24 кВт)
-Baxi ECO Four
--Baxi ECO Four 24 (мощность 24 кВт)
--Baxi ECO Four 24 F (мощность 24 кВт)
-Baxi LUNA-3
--Baxi LUNA-3 280 Fi (мощность 28 кВт)
--Baxi LUNA-3 310 Fi
  (мощность 31 кВт)

Фильтрация по производителю и по мощности (от .. до ..) + другие параметры

Пробовал делать через модификации, но максимум что можно сделать - это вывод отфильтрованных модификаций в куче, без группировки по товарам.

Для начала делаю вывод вида:
Группа
-ссылки Подгруппа 1, Подгруппа 2, Подгруппа 3
-отфильтрованные товары подгрупп в куче

Что нужно изменить:
Редактируем типовую динамическую страницу "Интернет-магазин"
Вместо
      $shop->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);

добавить код, отредактировать если нужно, имеется два варианта вывода - только товары подгрупп группы либо товары всех подгрупп группы
      // Вывод данных всех групп в XML
      $param['xml_show_group_type'] = 'all';

      // Если не корневая группа - выводим товары из всех её подгрупп
      if ($param['current_group_id'] != 0)
      {

         // Добавляем текущую группу в массив групп
         $param['current_group_id'] = array();
         $param['current_group_id'][] = $GLOBALS['shop_item_path']['group'];

         // Выборка подгрупп - выбрать необходимый вариант

         // Выборка только из подгрупп данной группы (и только активных)
         $param_groups['shop_groups_parent_id'] = $GLOBALS['shop_item_path']['group'];
         $param_groups['groups_activity'] = 1;

         $groups = $shop->GetAllGroups($current_shop_id, $param_groups);
      
         if (is_array($groups) && count($groups) > 0)
         {
            foreach ($groups as $group)
            {
               $param['current_group_id'][] = $group['shop_groups_id'];
            }
         }

         // Выборка из всех подгрупп группы (включая подгруппы подгрупп), без фильтра активности
         
         /*$mas_group = array();  
         $mas_group = $GLOBALS['shop']->GetGroupsTree($GLOBALS['shop_item_path']['group'], $current_shop_id, $mas_group);
         $set = array();
         $set = SetGroups($mas_group, $set);

         foreach ($set as $key => $value)
         {
                 $param['current_group_id'][] = $value;
         }*/
         

      }

      // Добавляем параметр /shop/current_group_id для указания текущей группы (т.к. в current_group_id у нас список групп),
      // меняем в xml вместо /shop/@current_group_id на /shop/current_group_id
      $external_propertys['current_group_id'] = $GLOBALS['shop_item_path']['group'];

      // Получаем доп.свойства текущей группы (так как если получаем список групп - то свойства берутся из всех, а не из текущей)
      // меняем в xml вместо /shop/properties_for_group на /shop/filter/properties_for_group
      $xml_properties_for_group = $GLOBALS['shop']->GenXml4Properties($current_shop_id, $GLOBALS['shop_item_path']['group']);
      $param['external_xml'] = '<filter>'.$xml_properties_for_group.'</filter>';

      $shop->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);


Редактируем XSL МагазинКаталогТоваров
Меняем во всех местах
@current_group_id на current_group_id - тогда нормально работает навигация, вывод подгрупп группы
properties_for_group на [i]filter/properties_for_group - тогда "Фильтр по дополнительным свойствам товара" выводится только для параметров, включенных в свойствах группы (а не берётся из подгрупп).

=================================================
Но это не совсем то, что мне нужно, минусы:
- нет группировки по подгруппам (и сортировки по ней) - все товары сортируются по полю сортировки товара.
- нет нужного вывода

Что я делаю:
- во-первых избавляюсь от разбития по страницам (потому что будет листинг товаров в строках)
добавляю перед ShowShop новый код
Типовая динамическая страница "Интернет-магазин"
      // Если несколько групп - выводим все товары разом
      if (is_array($param['current_group_id']) && count($param['current_group_id']) > 1)
      {
         $param['items_on_page'] = 1000;
      }

      $shop->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);


Что мы имеем в XML:
список подгрупп, список всех отфильтрованных товаров в куче.

Редактируем XSL МагазинКаталогТоваров
Вместо
         <xsl:apply-templates select="item" />

пишем
         <!-- Вывод подгрупп на месте общего списка товаров -->
         <xsl:if test="count(//group[@parent=$parent_group_id]) &gt; 0">
            <xsl:apply-templates select=".//group[@parent=$parent_group_id]" mode="group_items"/>
         </xsl:if>

         <!-- Вывод товаров текущей группы -->
         <xsl:apply-templates select="item[@group = $parent_group_id]" />


Добавляем template для group_items
   <!-- Шаблон для подгруппы с товарами -->
   <xsl:template match="group" mode="group_items">
      <xsl:variable name="group_id" select="@id"/>
      <!-- выводим, если количество товаров+подгрупп больше 0 -->
      <xsl:if test="(count_items + count_groups) &gt; 0">
         <!-- имя подгруппы -->
         <h2>
            <a href="{/shop/path}{fullpath}">
               <xsl:value-of disable-output-escaping="yes" select="name"/>
            </a>
         </h2>

         <!-- подгруппы подгруппы -->
         <div>
            <xsl:if test="count(group) &gt; 0">
               <xsl:apply-templates select="group" mode="sub_group"/>
            </xsl:if>
         </div>

         <!-- товары подгруппы -->
         <xsl:apply-templates select="/shop/item[@group = $group_id]" mode="group_item"/>
      </xsl:if>
   </xsl:template>

и group_item
   <!-- Шаблон для товара подгруппы -->
   <xsl:template match="item" mode="group_item">
      <!--Название товара -->
      <h3>
         <a href="{/shop/path}{fullpath}{path}/">
            <xsl:value-of disable-output-escaping="yes" select="name"/>
         </a>
      </h3>
   </xsl:template>


#
Re: Вывод товаров из подгрупп, фильтрация - решения в одном месте
Демо?
http://www.aiventa.ru
#
Re: Re: Вывод товаров из подгрупп, фильтрация - решения в одном месте
hell0men писал(а):
Демо?

модуль shop везде один и тот же, будет работать на всех редакция. или вы что-то иное имели ввиду?
#
Re: Вывод товаров из подгрупп, фильтрация - решения в одном месте
Хорошее решение, спасибо)
Авторизация