Добавляем в фильтр товаров выпадающий список доп. свойств

#
Добавляем в фильтр товаров выпадающий список доп. свойств
Здравствуйте!
В версии Халява нет списков, у меня была задача сортировать по доп. свойству, которые будут представлены в виде выпадающего списка.
В стандартном шаблоне есть ТДС Виджеты->Левый блок-> Виджет::Фильтр Товаров, в Коде странице есть блок начинающейся так 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 строка

дальше идет родной код.

дальше в 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: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>


вроде все, в фильтре появляются списки  Размер, Сезон, Стиль, Цвет

Скорее всего можно было получать все доп.свойства и не прописывать их в ручную, но я пока не знаю как это сделать, не судите строго.
У кого есть другой вариант, поделитесь.
Авторизация