Здравствуйте!
На форуме очень много тем про подгруппы, но в одном месте нет общего решения, лишь куски.
Моя задача:
Есть структура
Группа
-Подгруппа 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]) > 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) > 0">
<!-- имя подгруппы -->
<h2>
<a href="{/shop/path}{fullpath}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</a>
</h2>
<!-- подгруппы подгруппы -->
<div>
<xsl:if test="count(group) > 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>