Добавляем в фильтр товаров выпадающий список доп. свойств
Здравствуйте!
В версии Халява нет списков, у меня была задача сортировать по доп. свойству, которые будут представлены в виде выпадающего списка.
В стандартном шаблоне есть ТДС Виджеты->Левый блок-> Виджет::Фильтр Товаров, в Коде странице есть блок начинающейся так foreach ($aProperties as $oProperty) {
сразу после начала этого цикла вставляем:
дальше идет родной код.
дальше в XSL есть блок начинающийся так
где нибудь ниже вставляем шаблоны
вроде все, в фильтре появляются списки Размер, Сезон, Стиль, Цвет
Скорее всего можно было получать все доп.свойства и не прописывать их в ручную, но я пока не знаю как это сделать, не судите строго.
У кого есть другой вариант, поделитесь.
В версии Халява нет списков, у меня была задача сортировать по доп. свойству, которые будут представлены в виде выпадающего списка.
В стандартном шаблоне есть ТДС Виджеты->Левый блок-> Виджет::Фильтр Товаров, в Коде странице есть блок начинающейся так foreach ($aProperties as $oProperty) {
сразу после начала этого цикла вставляем:
foreach ($aProperties as $oProperty) {
//Выборка с Property_Value_ints число size
$oProperty_Value_Ints = Core_QueryBuilder::select()
->from('property_value_ints')
->where('property_id', '=', $oProperty->tag_name == 'size' ? $oProperty->id : null); // size - название доп. поля типа число
$aRows_Property_Value_Ints = $oProperty_Value_Ints->execute()->asAssoc()->result();
// убираем дубликаты из выборки
$aRows_Property_Value_Ints_Temp = [];
foreach ($aRows_Property_Value_Ints as $key => $value) {
if ($value['value'] != 0) {
$aRows_Property_Value_Ints_Temp[$value['value']] = $key;
}
}
// конечный массив в котором только уникальные значения доп. свойств
$result_ints = [];
foreach ($aRows_Property_Value_Ints_Temp as $value) {
$result_ints[] = $aRows_Property_Value_Ints[$value];
}
foreach ($result_ints as $row) {
$Shop_Controller_Show->addEntity(
$oParams_array = Core::factory('Core_Xml_Entity')->name('property_size')
->addAttribute('id', $row['id'])
->addAttribute('tag_name', 'size')
);
foreach ($row as $item => $value) {
$oParams_array->addEntity(
Core::factory('Core_Xml_Entity')
->name($item)->value($value)
);
}
}
//Выборка с Property_Value_ints число
//Выборка с Property_Value_Strings строка colors
$aProperty_Strings = ['colors', 'style', 'season']; // название доп. свойств типа строка
foreach ($aProperty_Strings as $aProperty_String) {
$oProperty_Value_Strings = Core_QueryBuilder::select()
->from('property_value_strings')
->where('property_id', '=', $oProperty->tag_name == $aProperty_String ? $oProperty->id : null);
$aRows_Property_Value_Strings = $oProperty_Value_Strings->execute()->asAssoc()->result();
$aRows_Property_Value_Strings_Temp = [];
foreach ($aRows_Property_Value_Strings as $key => $value) {
strip_tags($value['value']);
if ($value['value'] != '' and !ctype_digit($value['value'])) {
$aRows_Property_Value_Strings_Temp[$value['value']] = $key;
}
}
$result_strings = [];
foreach ($aRows_Property_Value_Strings_Temp as $value) {
$result_strings[] = $aRows_Property_Value_Strings[$value];
}
foreach ($result_strings as $row) {
$Shop_Controller_Show->addEntity(
$oParams_array = Core::factory('Core_Xml_Entity')->name('property_'.$aProperty_String)
->addAttribute('id', $row['id'])
->addAttribute('tag_name', $aProperty_String)
);
foreach ($row as $item => $value) {
$oParams_array->addEntity(
Core::factory('Core_Xml_Entity')
->name($item)->value($value)
);
}
}
}
//Выборка с Property_Value_Strings строка
//Выборка с Property_Value_ints число size
$oProperty_Value_Ints = Core_QueryBuilder::select()
->from('property_value_ints')
->where('property_id', '=', $oProperty->tag_name == 'size' ? $oProperty->id : null); // size - название доп. поля типа число
$aRows_Property_Value_Ints = $oProperty_Value_Ints->execute()->asAssoc()->result();
// убираем дубликаты из выборки
$aRows_Property_Value_Ints_Temp = [];
foreach ($aRows_Property_Value_Ints as $key => $value) {
if ($value['value'] != 0) {
$aRows_Property_Value_Ints_Temp[$value['value']] = $key;
}
}
// конечный массив в котором только уникальные значения доп. свойств
$result_ints = [];
foreach ($aRows_Property_Value_Ints_Temp as $value) {
$result_ints[] = $aRows_Property_Value_Ints[$value];
}
foreach ($result_ints as $row) {
$Shop_Controller_Show->addEntity(
$oParams_array = Core::factory('Core_Xml_Entity')->name('property_size')
->addAttribute('id', $row['id'])
->addAttribute('tag_name', 'size')
);
foreach ($row as $item => $value) {
$oParams_array->addEntity(
Core::factory('Core_Xml_Entity')
->name($item)->value($value)
);
}
}
//Выборка с Property_Value_ints число
//Выборка с Property_Value_Strings строка colors
$aProperty_Strings = ['colors', 'style', 'season']; // название доп. свойств типа строка
foreach ($aProperty_Strings as $aProperty_String) {
$oProperty_Value_Strings = Core_QueryBuilder::select()
->from('property_value_strings')
->where('property_id', '=', $oProperty->tag_name == $aProperty_String ? $oProperty->id : null);
$aRows_Property_Value_Strings = $oProperty_Value_Strings->execute()->asAssoc()->result();
$aRows_Property_Value_Strings_Temp = [];
foreach ($aRows_Property_Value_Strings as $key => $value) {
strip_tags($value['value']);
if ($value['value'] != '' and !ctype_digit($value['value'])) {
$aRows_Property_Value_Strings_Temp[$value['value']] = $key;
}
}
$result_strings = [];
foreach ($aRows_Property_Value_Strings_Temp as $value) {
$result_strings[] = $aRows_Property_Value_Strings[$value];
}
foreach ($result_strings as $row) {
$Shop_Controller_Show->addEntity(
$oParams_array = Core::factory('Core_Xml_Entity')->name('property_'.$aProperty_String)
->addAttribute('id', $row['id'])
->addAttribute('tag_name', $aProperty_String)
);
foreach ($row as $item => $value) {
$oParams_array->addEntity(
Core::factory('Core_Xml_Entity')
->name($item)->value($value)
);
}
}
}
//Выборка с Property_Value_Strings строка
дальше идет родной код.
дальше в XSL есть блок начинающийся так
<!-- Отображаем список -->
<xsl:when test="filter = 2">
<select class="form-control" name="property_{@id}">
<option value="0">...</option>
<xsl:if test="tag_name = 'colors'"> <!-- Проверяем есть ли в XML colors-->
<xsl:apply-templates select="/shop/property_colors"/> <!-- Рисуем шаблон -->
</xsl:if>
<xsl:if test="tag_name = 'season'">
<xsl:apply-templates select="/shop/property_season"/>
</xsl:if>
<xsl:if test="tag_name = 'style'">
<xsl:apply-templates select="/shop/property_style"/>
</xsl:if>
<xsl:if test="tag_name = 'size'">
<xsl:apply-templates select="/shop/property_size"/>
</xsl:if>
<!--<xsl:apply-templates select="list/list_item"/>-->
</select>
</xsl:when>
<xsl:when test="filter = 2">
<select class="form-control" name="property_{@id}">
<option value="0">...</option>
<xsl:if test="tag_name = 'colors'"> <!-- Проверяем есть ли в XML colors-->
<xsl:apply-templates select="/shop/property_colors"/> <!-- Рисуем шаблон -->
</xsl:if>
<xsl:if test="tag_name = 'season'">
<xsl:apply-templates select="/shop/property_season"/>
</xsl:if>
<xsl:if test="tag_name = 'style'">
<xsl:apply-templates select="/shop/property_style"/>
</xsl:if>
<xsl:if test="tag_name = 'size'">
<xsl:apply-templates select="/shop/property_size"/>
</xsl:if>
<!--<xsl:apply-templates select="list/list_item"/>-->
</select>
</xsl:when>
где нибудь ниже вставляем шаблоны
<xsl:template match="property_colors">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_season">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_style">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_size">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_season">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_style">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
<xsl:template match="property_size">
<option value="{value}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:template>
вроде все, в фильтре появляются списки Размер, Сезон, Стиль, Цвет
Скорее всего можно было получать все доп.свойства и не прописывать их в ручную, но я пока не знаю как это сделать, не судите строго.
У кого есть другой вариант, поделитесь.
Авторизация