Пример организации каталога автотоваров, распределенных по группам с фильтрацией по меткам (+)
Описание задачи:
Цитата:
Есть каталог тюнинга на автомобили по категориям, например
- передний обвес
- задний обвес
- спойлера
Один обвес может подходить к нескольким моделям автомобилей, модели указываются метками.
Поиск должен производиться по модельно, нажатием на облако моделей, т.е. в каждый вид товара в метки указывается название автомобиля, и при нажатии на метку вылетает все что относится к этой модели, но необходимо сделать чтобы это не просто кучей высыпалось а было отсортировано по папкам.
т.е. нажимаем Infiniti FX вылезают папки (либо название папки сверху и открытый список внизу)
- передний обвес
- задний обвес
- спойлера
а внутри уже лежит только все для FX
Решение задачи:
1. В типовой динамической странице фрагмент
// При выводе тэгов вывод элементов ведется из всех групп
$param['current_group_id'] = false;
заменяем на
// При выводе тэгов вывод элементов ведется из всех групп
//$param['current_group_id'] = false;
2. В XSL-шаблоне "МагазинКаталогТоваров" фрагмент:
<!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
<xsl:if test="count(selected_tags/tag) = 0 and count(//group[@parent=$parent_group_id]) > 0">
Заменяем на
<!-- Отображение подгрупп данной группы, только если подгруппы есть и не идет фильтра по меткам -->
<xsl:if test="count(selected_tags/tag) = 0 and count(//group[@parent=$parent_group_id]) > 0">
3. В XSL-шаблоне "МагазинКаталогТоваров" заменяем:
<div style="margin-bottom: 15px;">
<a href="{/shop/path}{fullpath}" style="font-weight: bold">
на
<!-- Если был передан тег, допишем в ссылки с группы -->
<xsl:variable name="tagpath"><xsl:choose>
<xsl:when test="count(/shop/selected_tags/tag) > 0">tag/<xsl:value-of select="/shop/selected_tags/tag/tag_path_name" />/</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose></xsl:variable>
<div style="margin-bottom: 15px;">
<a href="{/shop/path}{fullpath}{$tagpath}" style="font-weight: bold">
4. В XSL-шаблоне "МагазинКаталогТоваров" заменяем:
заменяем
<xsl:if test="@parent=0">
<a href="{/shop/path}">
<xsl:value-of select="/shop/name"/>
</a>
</xsl:if>
на
<!-- Если был передан тег, допишем в ссылки с группы -->
<xsl:variable name="tagpath"><xsl:choose>
<xsl:when test="count(/shop/selected_tags/tag) > 0">tag/<xsl:value-of select="/shop/selected_tags/tag/tag_path_name" />/</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose></xsl:variable>
<xsl:if test="@parent=0">
<a href="{/shop/path}{$tagpath}">
<xsl:value-of select="/shop/name"/>
</a>
</xsl:if>
Далее изменяем вызов показа тегов, нам необходимо сделать, чтобы выводились только теги, доступные в текущей группе.
Для этого в шаблоне/макете код:
<?php
if (class_exists('shop'))
{
$shop = & singleton('shop');
/* Отображаем тэги */
$shop->ShowTagsCloud(to_int($GLOBALS['LA']['shop_id']), 'ОблакоТэговМагазин');
}
?>
заменяем на
<?php
if (class_exists('shop'))
{
$shop = & singleton('shop');
$property = array();
if (isset($GLOBALS['shop_item_path']['group']) && $GLOBALS['shop_item_path']['group'])
{
$property['In'] = array(0);
$shop_current_group_id = intval($GLOBALS['shop_item_path']['group']);
$aSubGroup = $shop->GetGroupsTree($shop_current_group_id, to_int($GLOBALS['LA']['shop_id']));
// Записываем выбранные подгруппы в массив
foreach($aSubGroup as $group_id => $value)
{
$aItemsInGroup = $shop->GetAllItems(to_int($GLOBALS['LA']['shop_id']), $group_id);
if (is_array($aItemsInGroup) && count($aItemsInGroup) > 0)
{
foreach ($aItemsInGroup as $aItemRow)
{
$property['In'][] = $aItemRow['shop_items_catalog_item_id'];
}
}
}
}
/* Отображаем тэги */
$shop->ShowTagsCloud(to_int($GLOBALS['LA']['shop_id']), 'ОблакоТэговМагазин', $property);
}
?>
Вышеуказанный код для облака тегов будет работать с версии 5.5.6.