Фильтровать по производителю
Добрый день форумчане, подскажите как добавить в фильтр возможность фильтровать по производителю.
В данный момент реализовал это путем добавления поля в шаблон xsl, но есть минусы:
- постоянно надо править выпадающий список с производителями так как поле создано вручную;
- в независимости от категории товара там отображаются все производители, а хотелось бы что бы там отображались только те производители чей товар есть в открытой категории;
Как это можно реализовать подскажите пожалуйста.
В данный момент реализовал это путем добавления поля в шаблон xsl, но есть минусы:
- постоянно надо править выпадающий список с производителями так как поле создано вручную;
- в независимости от категории товара там отображаются все производители, а хотелось бы что бы там отображались только те производители чей товар есть в открытой категории;
Как это можно реализовать подскажите пожалуйста.
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
1. Проверяете наличие данных в XML, если нет, включаете их вывод через контроллер или добавляете производителей контроллеру на PHP.
2. В XSL-шаблоне используете эти данные.
2. В XSL-шаблоне используете эти данные.
А примера случаем нет )
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
В XML вроде бы есть, внутри shop_item
<shop_producer id="46">
<shop_producer_dir_id>0</shop_producer_dir_id>
<shop_id>1</shop_id>
<name>Strong</name>
<active>1</active>
<default>0</default>
<description></description>
<image_large></image_large>
<image_small></image_small>
<sorting>0</sorting>
<path>strong</path>
<user_id>19</user_id>
<address></address>
<phone></phone>
<fax></fax>
<site></site>
<email></email>
<tin></tin>
<kpp></kpp>
<psrn></psrn>
<okpo></okpo>
<okved></okved>
<bik></bik>
<current_account></current_account>
<correspondent_account></correspondent_account>
<bank_name></bank_name>
<bank_address></bank_address>
<seo_title></seo_title>
<seo_description></seo_description>
<seo_keywords></seo_keywords>
<dir>/upload/shop_1/producers/</dir>
</shop_producer>
<shop_producer id="46">
<shop_producer_dir_id>0</shop_producer_dir_id>
<shop_id>1</shop_id>
<name>Strong</name>
<active>1</active>
<default>0</default>
<description></description>
<image_large></image_large>
<image_small></image_small>
<sorting>0</sorting>
<path>strong</path>
<user_id>19</user_id>
<address></address>
<phone></phone>
<fax></fax>
<site></site>
<email></email>
<tin></tin>
<kpp></kpp>
<psrn></psrn>
<okpo></okpo>
<okved></okved>
<bik></bik>
<current_account></current_account>
<correspondent_account></correspondent_account>
<bank_name></bank_name>
<bank_address></bank_address>
<seo_title></seo_title>
<seo_description></seo_description>
<seo_keywords></seo_keywords>
<dir>/upload/shop_1/producers/</dir>
</shop_producer>
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
Вот так:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<xsl:template match="/">
<xsl:apply-templates select="/shop"/>
</xsl:template>
<xsl:variable name="n" select="number(3)"/>
<xsl:template match="/shop">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="path">
<xsl:choose>
<xsl:when test="/shop//shop_group[@id=$group]/node()"><xsl:value-of select="/shop//shop_group[@id=$group]/url"/></xsl:when>
<xsl:otherwise><xsl:value-of select="/shop/url"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- дополнение пути для action, если выбрана метка -->
<xsl:variable name="form_tag_url"><xsl:if test="count(tag) = 1">tag/<xsl:value-of select="tag/urlencode"/>/</xsl:if></xsl:variable>
<form method="get" action="{$path}{$form_tag_url}" class="form-inline" id="fifi">
<div class="">
<div class="sorting">
<select class="form-control" name="sorting" onchange="$(this).parents('form:first').submit()">
<option value="0">Сортировать</option>
<option value="1">
<xsl:if test="sorting = 1"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дешевые)
</option>
<option value="2">
<xsl:if test="sorting = 2"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дорогие)
</option>
<option value="3">
<xsl:if test="sorting = 3"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По названию
</option>
</select>
</div>
<div class="sorting">
<select class="form-control" name="producer_id">
<option value="81">AEG</option>
<option value="60">Bison</option>
<option value="48">Black Horn</option>
<option value="55">Champion</option>
<option value="85">D.BOR</option>
<option value="44">Delog</option>
<option value="67">Eastman</option>
<option value="80">ECHO</option>
<option value="71">Hagwert</option>
<option value="79">Hawera</option>
<option value="62">Hilti</option>
<option value="63">Hitachi</option>
<option value="58">Klingspor</option>
<option value="75">Makita</option>
<option value="64">Mr.Logo</option>
<option value="70">Runex</option>
<option value="47">SEB</option>
<option value="45">Skol</option>
<option value="65">Skrab</option>
<option value="83">STABILA</option>
<option value="68">Stelgrit</option>
<option value="49">Stellite</option>
<option value="69">Stern</option>
<option value="54">Stihl</option>
<option value="46">Strong</option>
<option value="52">Sturm</option>
<option value="43">Whirlpower</option>
<option value="51">Атака</option>
<option value="74">Диолд</option>
<option value="66">Инстра Пласт</option>
<option value="72">Интерскол</option>
<option value="53">Каprо</option>
<option value="30">Креост</option>
<option value="78">Лепсе</option>
<option value="77">Ливгидромаш</option>
<option value="84">Луга Абразив</option>
<option value="57">Партнер</option>
<option value="50">Практик</option>
<option value="56">Резер</option>
<option value="76">Техноприбор</option>
<option value="42">Туламаш</option>
<option value="61">Укрдиамант</option>
<option value="73">Фиолент</option>
<option value="86">Витязь</option>
<option value="87">Электромаш</option>
</select>
</div>
<div class="priceFilter">
<xsl:text>Цена от: </xsl:text>
<div class="form-group">
<input name="price_from" class="form-control ot" size="5" type="text" value="{/shop/min_price}">
<xsl:if test="/shop/price_from != 0">
<xsl:attribute name="value"><xsl:value-of select="/shop/price_from"/></xsl:attribute>
</xsl:if>
</input></div>
<xsl:text> до: </xsl:text>
<div class="form-group">
<input name="price_to" class="form-control do" size="5" type="text" value="{/shop/max_price}">
<xsl:if test="/shop/price_to != 0">
<xsl:attribute name="value"><xsl:value-of select="/shop/price_to"/></xsl:attribute>
</xsl:if>
</input>
</div>
<input name="price_from_original" value="{/shop/min_price}" hidden="hidden" />
<input name="price_to_original" value="{/shop/max_price}" hidden="hidden" />
</div>
<!-- Фильтр по дополнительным свойствам товара: -->
<xsl:if test="count(shop_item_properties//property[filter != 0 and (type = 0 or type = 1 or type = 3 or type = 7 or type = 11)])">
<span class="table_row"></span>
<xsl:apply-templates select="shop_item_properties//property[filter != 0 and (type = 0 or type = 1 or type = 3 or type = 7 or type = 11)]" mode="propertyList"/>
</xsl:if>
<div class="form-group"><input name="filter" class="btn btn-primary b fil" style="clear:both;" value="Фильтровать" type="submit"/></div>
</div>
</form>
</xsl:template>
<!-- Шаблон для фильтра по дополнительным свойствам -->
<xsl:template match="property" mode="propertyList">
<xsl:variable name="nodename">property_<xsl:value-of select="@id"/></xsl:variable>
<xsl:variable name="nodename_from">property_<xsl:value-of select="@id"/>_from</xsl:variable>
<xsl:variable name="nodename_to">property_<xsl:value-of select="@id"/>_to</xsl:variable>
<fieldset>
<!-- Не флажок -->
<xsl:if test="filter != 5">
<legend>
<span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
</legend>
</xsl:if>
<xsl:choose>
<!-- Отображаем поле ввода -->
<xsl:when test="filter = 1">
<br/>
<input type="text" name="property_{@id}">
<xsl:if test="/shop/*[name()=$nodename] != ''">
<xsl:attribute name="value"><xsl:value-of select="/shop/*[name()=$nodename]"/></xsl:attribute>
</xsl:if>
</input>
</xsl:when>
<!-- Отображаем список -->
<xsl:when test="filter = 2">
<br/>
<select name="property_{@id}">
<option value="0">...</option>
<xsl:apply-templates select="list/list_item"/>
</select>
</xsl:when>
<!-- Отображаем переключатели -->
<xsl:when test="filter = 3">
<br/>
<div class="propertyInput">
<input type="radio" name="property_{@id}" value="0" id="id_prop_radio_{@id}_0"></input>
<label for="id_prop_radio_{@id}_0">Любой вариант</label>
<xsl:apply-templates select="list/list_item"/>
</div>
</xsl:when>
<!-- Отображаем флажки -->
<xsl:when test="filter = 4">
<div class="propertyInput">
<xsl:apply-templates select="list/list_item"/>
</div>
<div style="display:none; text-align: center;">
...
</div>
</xsl:when>
<!-- Отображаем флажок -->
<xsl:when test="filter = 5">
<input type="checkbox" name="property_{@id}" id="property_{@id}" style="padding-top:4px">
<xsl:if test="/shop/*[name()=$nodename] != ''">
<xsl:attribute name="checked"><xsl:value-of select="/shop/*[name()=$nodename]"/></xsl:attribute>
</xsl:if>
</input>
<label for="property_{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/><xsl:text> </xsl:text>
</label>
</xsl:when>
<!-- Отображение полей "от и до" -->
<xsl:when test="filter = 6">
<div class="propertyInput">
<div>
от: <input type="text" name="property_{@id}_from" size="5" value="{/shop/*[name()=$nodename_from]}"/> до: <input type="text" name="property_{@id}_to" size="5" value="{/shop/*[name()=$nodename_to]}"/>
<input name="property_{@id}_from_original" value="{/shop/*[name()=$nodename_from]}" hidden="hidden" />
<input name="property_{@id}_to_original" value="{/shop/*[name()=$nodename_to]}" hidden="hidden" />
</div>
<div class="slider"></div><br/>
</div>
</xsl:when>
<!-- Отображаем список с множественным выбором-->
<xsl:when test="filter = 7">
<br/>
<select name="property_{@id}[]" multiple="multiple">
<xsl:apply-templates select="list/list_item"/>
</select>
</xsl:when>
</xsl:choose>
</fieldset>
</xsl:template>
<xsl:template match="list/list_item">
<xsl:if test="../../filter = 2">
<!-- Отображаем список -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<option value="{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:if>
<xsl:if test="../../filter = 3">
<!-- Отображаем переключатели -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<br/>
<input type="radio" name="property_{../../@id}" value="{@id}" id="id_property_{../../@id}_{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="checked">checked</xsl:attribute>
</xsl:if>
<label for="id_property_{../../@id}_{@id}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</label>
</input>
</xsl:if>
<xsl:if test="../../filter = 4">
<!-- Отображаем флажки -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<input type="checkbox" value="{@id}" name="property_{../../@id}[]" id="property_{../../@id}_{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="checked">checked</xsl:attribute>
</xsl:if>
<label for="property_{../../@id}_{@id}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</label>
</input>
<br/>
</xsl:if>
<xsl:if test="../../filter = 7">
<!-- Отображаем список -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<option value="{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="selected">
</xsl:attribute>
</xsl:if>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hostcms="http://www.hostcms.ru/"
exclude-result-prefixes="hostcms">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="utf-8" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:decimal-format name="my" decimal-separator="," grouping-separator=" "/>
<xsl:template match="/">
<xsl:apply-templates select="/shop"/>
</xsl:template>
<xsl:variable name="n" select="number(3)"/>
<xsl:template match="/shop">
<!-- Получаем ID родительской группы и записываем в переменную $group -->
<xsl:variable name="group" select="group"/>
<xsl:variable name="path">
<xsl:choose>
<xsl:when test="/shop//shop_group[@id=$group]/node()"><xsl:value-of select="/shop//shop_group[@id=$group]/url"/></xsl:when>
<xsl:otherwise><xsl:value-of select="/shop/url"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!-- дополнение пути для action, если выбрана метка -->
<xsl:variable name="form_tag_url"><xsl:if test="count(tag) = 1">tag/<xsl:value-of select="tag/urlencode"/>/</xsl:if></xsl:variable>
<form method="get" action="{$path}{$form_tag_url}" class="form-inline" id="fifi">
<div class="">
<div class="sorting">
<select class="form-control" name="sorting" onchange="$(this).parents('form:first').submit()">
<option value="0">Сортировать</option>
<option value="1">
<xsl:if test="sorting = 1"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дешевые)
</option>
<option value="2">
<xsl:if test="sorting = 2"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По цене (сначала дорогие)
</option>
<option value="3">
<xsl:if test="sorting = 3"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
По названию
</option>
</select>
</div>
<div class="sorting">
<select class="form-control" name="producer_id">
<option value="81">AEG</option>
<option value="60">Bison</option>
<option value="48">Black Horn</option>
<option value="55">Champion</option>
<option value="85">D.BOR</option>
<option value="44">Delog</option>
<option value="67">Eastman</option>
<option value="80">ECHO</option>
<option value="71">Hagwert</option>
<option value="79">Hawera</option>
<option value="62">Hilti</option>
<option value="63">Hitachi</option>
<option value="58">Klingspor</option>
<option value="75">Makita</option>
<option value="64">Mr.Logo</option>
<option value="70">Runex</option>
<option value="47">SEB</option>
<option value="45">Skol</option>
<option value="65">Skrab</option>
<option value="83">STABILA</option>
<option value="68">Stelgrit</option>
<option value="49">Stellite</option>
<option value="69">Stern</option>
<option value="54">Stihl</option>
<option value="46">Strong</option>
<option value="52">Sturm</option>
<option value="43">Whirlpower</option>
<option value="51">Атака</option>
<option value="74">Диолд</option>
<option value="66">Инстра Пласт</option>
<option value="72">Интерскол</option>
<option value="53">Каprо</option>
<option value="30">Креост</option>
<option value="78">Лепсе</option>
<option value="77">Ливгидромаш</option>
<option value="84">Луга Абразив</option>
<option value="57">Партнер</option>
<option value="50">Практик</option>
<option value="56">Резер</option>
<option value="76">Техноприбор</option>
<option value="42">Туламаш</option>
<option value="61">Укрдиамант</option>
<option value="73">Фиолент</option>
<option value="86">Витязь</option>
<option value="87">Электромаш</option>
</select>
</div>
<div class="priceFilter">
<xsl:text>Цена от: </xsl:text>
<div class="form-group">
<input name="price_from" class="form-control ot" size="5" type="text" value="{/shop/min_price}">
<xsl:if test="/shop/price_from != 0">
<xsl:attribute name="value"><xsl:value-of select="/shop/price_from"/></xsl:attribute>
</xsl:if>
</input></div>
<xsl:text> до: </xsl:text>
<div class="form-group">
<input name="price_to" class="form-control do" size="5" type="text" value="{/shop/max_price}">
<xsl:if test="/shop/price_to != 0">
<xsl:attribute name="value"><xsl:value-of select="/shop/price_to"/></xsl:attribute>
</xsl:if>
</input>
</div>
<input name="price_from_original" value="{/shop/min_price}" hidden="hidden" />
<input name="price_to_original" value="{/shop/max_price}" hidden="hidden" />
</div>
<!-- Фильтр по дополнительным свойствам товара: -->
<xsl:if test="count(shop_item_properties//property[filter != 0 and (type = 0 or type = 1 or type = 3 or type = 7 or type = 11)])">
<span class="table_row"></span>
<xsl:apply-templates select="shop_item_properties//property[filter != 0 and (type = 0 or type = 1 or type = 3 or type = 7 or type = 11)]" mode="propertyList"/>
</xsl:if>
<div class="form-group"><input name="filter" class="btn btn-primary b fil" style="clear:both;" value="Фильтровать" type="submit"/></div>
</div>
</form>
</xsl:template>
<!-- Шаблон для фильтра по дополнительным свойствам -->
<xsl:template match="property" mode="propertyList">
<xsl:variable name="nodename">property_<xsl:value-of select="@id"/></xsl:variable>
<xsl:variable name="nodename_from">property_<xsl:value-of select="@id"/>_from</xsl:variable>
<xsl:variable name="nodename_to">property_<xsl:value-of select="@id"/>_to</xsl:variable>
<fieldset>
<!-- Не флажок -->
<xsl:if test="filter != 5">
<legend>
<span><xsl:value-of disable-output-escaping="yes" select="name"/></span>
</legend>
</xsl:if>
<xsl:choose>
<!-- Отображаем поле ввода -->
<xsl:when test="filter = 1">
<br/>
<input type="text" name="property_{@id}">
<xsl:if test="/shop/*[name()=$nodename] != ''">
<xsl:attribute name="value"><xsl:value-of select="/shop/*[name()=$nodename]"/></xsl:attribute>
</xsl:if>
</input>
</xsl:when>
<!-- Отображаем список -->
<xsl:when test="filter = 2">
<br/>
<select name="property_{@id}">
<option value="0">...</option>
<xsl:apply-templates select="list/list_item"/>
</select>
</xsl:when>
<!-- Отображаем переключатели -->
<xsl:when test="filter = 3">
<br/>
<div class="propertyInput">
<input type="radio" name="property_{@id}" value="0" id="id_prop_radio_{@id}_0"></input>
<label for="id_prop_radio_{@id}_0">Любой вариант</label>
<xsl:apply-templates select="list/list_item"/>
</div>
</xsl:when>
<!-- Отображаем флажки -->
<xsl:when test="filter = 4">
<div class="propertyInput">
<xsl:apply-templates select="list/list_item"/>
</div>
<div style="display:none; text-align: center;">
...
</div>
</xsl:when>
<!-- Отображаем флажок -->
<xsl:when test="filter = 5">
<input type="checkbox" name="property_{@id}" id="property_{@id}" style="padding-top:4px">
<xsl:if test="/shop/*[name()=$nodename] != ''">
<xsl:attribute name="checked"><xsl:value-of select="/shop/*[name()=$nodename]"/></xsl:attribute>
</xsl:if>
</input>
<label for="property_{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/><xsl:text> </xsl:text>
</label>
</xsl:when>
<!-- Отображение полей "от и до" -->
<xsl:when test="filter = 6">
<div class="propertyInput">
<div>
от: <input type="text" name="property_{@id}_from" size="5" value="{/shop/*[name()=$nodename_from]}"/> до: <input type="text" name="property_{@id}_to" size="5" value="{/shop/*[name()=$nodename_to]}"/>
<input name="property_{@id}_from_original" value="{/shop/*[name()=$nodename_from]}" hidden="hidden" />
<input name="property_{@id}_to_original" value="{/shop/*[name()=$nodename_to]}" hidden="hidden" />
</div>
<div class="slider"></div><br/>
</div>
</xsl:when>
<!-- Отображаем список с множественным выбором-->
<xsl:when test="filter = 7">
<br/>
<select name="property_{@id}[]" multiple="multiple">
<xsl:apply-templates select="list/list_item"/>
</select>
</xsl:when>
</xsl:choose>
</fieldset>
</xsl:template>
<xsl:template match="list/list_item">
<xsl:if test="../../filter = 2">
<!-- Отображаем список -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<option value="{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:if>
<xsl:if test="../../filter = 3">
<!-- Отображаем переключатели -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<br/>
<input type="radio" name="property_{../../@id}" value="{@id}" id="id_property_{../../@id}_{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="checked">checked</xsl:attribute>
</xsl:if>
<label for="id_property_{../../@id}_{@id}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</label>
</input>
</xsl:if>
<xsl:if test="../../filter = 4">
<!-- Отображаем флажки -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<input type="checkbox" value="{@id}" name="property_{../../@id}[]" id="property_{../../@id}_{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="checked">checked</xsl:attribute>
</xsl:if>
<label for="property_{../../@id}_{@id}">
<xsl:value-of disable-output-escaping="yes" select="value"/>
</label>
</input>
<br/>
</xsl:if>
<xsl:if test="../../filter = 7">
<!-- Отображаем список -->
<xsl:variable name="nodename">property_<xsl:value-of select="../../@id"/></xsl:variable>
<option value="{@id}">
<xsl:if test="/shop/*[name()=$nodename] = @id">
<xsl:attribute name="selected">
</xsl:attribute>
</xsl:if>
<xsl:value-of disable-output-escaping="yes" select="value"/>
</option>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
1. Это не PHP.
2. Откуда у вас в фильтре вообще взялся shop_item?
2. Откуда у вас в фильтре вообще взялся shop_item?
Ну через настройки ТДС пробовал вот так:
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));
class My_Shop_Controller_Show extends Shop_Controller_Show
{
protected function _groupCondition()
{
$oShop = $this->getEntity();
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')
->value(Core_Array::getGet('producer_id'))
);
$Shop_Controller_Show->addEntity($oProducersXmlEntity);
// Список производителей
$aShop_Producers = $oShop->Shop_Producers->findAll();
foreach ($aShop_Producers as $oShop_Producer)
{
// Добавляем производителя потомком XML-сущности
$oProducersXmlEntity->addEntity(
$oShop_Producer->clearEntities()
);
}
if ($this->group)
{
// если ID группы не 0, т.е. не корневая группа
// получаем подгруппы
$aSubGroupsID = $this->fillShopGroup($oShop->id, $this->group); // добавляем текущую группу в массив
$aSubGroupsID[] = $this->group;
$this->shopItems()
->queryBuilder()
->where('shop_items.shop_group_id', 'IN', $aSubGroupsID); // получаем все товары из подгрупп
}
else
{
$this->shopItems()
->queryBuilder()
->where('shop_items.shop_group_id', '=', 0);
}
return $this;
}
protected $_aGroupTree = array();
public function fillShopGroup($iShopId, $iShopGroupParentId = 0, $iLevel = 0)
{
$iShopId = intval($iShopId);
$iShopGroupParentId = intval($iShopGroupParentId);
$iLevel = intval($iLevel);
if ($iLevel == 0)
{
$aTmp = Core_QueryBuilder::select('id', 'parent_id')
->from('shop_groups')
->where('shop_id', '=', $iShopId)
->where('deleted', '=', 0)
->execute()->asAssoc()->result();
foreach ($aTmp as $aGroup)
{
$this->_aGroupTree[$aGroup['parent_id']][] = $aGroup;
}
}
$aReturn = array();
if (isset($this->_aGroupTree[$iShopGroupParentId]))
{
foreach ($this->_aGroupTree[$iShopGroupParentId] as $childrenGroup)
{
$aReturn[] = $childrenGroup['id'];
$aReturn = array_merge($aReturn, $this->fillShopGroup($iShopId, $childrenGroup['id'], $iLevel + 1));
}
}
$iLevel == 0 && $this->_aGroupTree = array();
return $aReturn;
}
}
Пробовал вызывать через:
$Shop_Controller_Show = new My_Shop_Controller_Show($oShop);
Не работает, вообще ложит сайт, щас вызываю стандартно:
$oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId'));
class My_Shop_Controller_Show extends Shop_Controller_Show
{
protected function _groupCondition()
{
$oShop = $this->getEntity();
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')
->value(Core_Array::getGet('producer_id'))
);
$Shop_Controller_Show->addEntity($oProducersXmlEntity);
// Список производителей
$aShop_Producers = $oShop->Shop_Producers->findAll();
foreach ($aShop_Producers as $oShop_Producer)
{
// Добавляем производителя потомком XML-сущности
$oProducersXmlEntity->addEntity(
$oShop_Producer->clearEntities()
);
}
if ($this->group)
{
// если ID группы не 0, т.е. не корневая группа
// получаем подгруппы
$aSubGroupsID = $this->fillShopGroup($oShop->id, $this->group); // добавляем текущую группу в массив
$aSubGroupsID[] = $this->group;
$this->shopItems()
->queryBuilder()
->where('shop_items.shop_group_id', 'IN', $aSubGroupsID); // получаем все товары из подгрупп
}
else
{
$this->shopItems()
->queryBuilder()
->where('shop_items.shop_group_id', '=', 0);
}
return $this;
}
protected $_aGroupTree = array();
public function fillShopGroup($iShopId, $iShopGroupParentId = 0, $iLevel = 0)
{
$iShopId = intval($iShopId);
$iShopGroupParentId = intval($iShopGroupParentId);
$iLevel = intval($iLevel);
if ($iLevel == 0)
{
$aTmp = Core_QueryBuilder::select('id', 'parent_id')
->from('shop_groups')
->where('shop_id', '=', $iShopId)
->where('deleted', '=', 0)
->execute()->asAssoc()->result();
foreach ($aTmp as $aGroup)
{
$this->_aGroupTree[$aGroup['parent_id']][] = $aGroup;
}
}
$aReturn = array();
if (isset($this->_aGroupTree[$iShopGroupParentId]))
{
foreach ($this->_aGroupTree[$iShopGroupParentId] as $childrenGroup)
{
$aReturn[] = $childrenGroup['id'];
$aReturn = array_merge($aReturn, $this->fillShopGroup($iShopId, $childrenGroup['id'], $iLevel + 1));
}
}
$iLevel == 0 && $this->_aGroupTree = array();
return $aReturn;
}
}
Пробовал вызывать через:
$Shop_Controller_Show = new My_Shop_Controller_Show($oShop);
Не работает, вообще ложит сайт, щас вызываю стандартно:
$Shop_Controller_Show = new Shop_Controller_Show($oShop);
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
В самом шаблоне вот так:
<?php
if (filter_input(INPUT_SERVER, 'REQUEST_URI') == '/shop/cart/' or filter_input(INPUT_SERVER, 'REQUEST_URI') == '/shop/') {
}
else {
if (Core::moduleIsActive('shop') && isset(Core_Page::instance()->libParams['shopId']))
{
$oShop = Core_Entity::factory('Shop', Core_Page::instance()->libParams['shopId']);
$Shop_Controller_Show = new Shop_Controller_Show($oShop);
$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('МагазинФильтр')
)
->groupsMode('tree')
->limit(0)
->itemsProperties(TRUE);
if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
{
$Shop_Controller_Show->group(Core_Page::instance()->object->group);
$iCurrentShopGroup = Core_Page::instance()->object->group;
}
else
{
$iCurrentShopGroup = 0;
}
$price_from = intval(Core_Array::getGet('price_from'));
$price_to = intval(Core_Array::getGet('price_to'));
if ($price_from)
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('price_from')->value($price_from)
);
$Shop_Controller_Show->addCacheSignature('price_from=' . $price_from);
}
if ($price_to)
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('price_to')->value($price_to)
);
$Shop_Controller_Show->addCacheSignature('price_to=' . $price_to);
}
//Sorting
if (Core_Array::getGet('sorting'))
{
$sorting = intval(Core_Array::getGet('sorting'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('sorting')->value($sorting)
);
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
}
//Producers
if (Core_Array::getGet('producer_id'))
{
$iProducerId = intval(Core_Array::getGet('producer_id'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')->value($iProducerId)
);
$Shop_Controller_Show->addCacheSignature('producer_id=' . $iProducerId);
}
// Additional properties
$oShop_Item_Property_List = Core_Entity::factory('Shop_Item_Property_List', $oShop->id);
$aProperties = $oShop_Item_Property_List->Properties->findAll();
$aTmpProperties = array();
foreach ($aProperties as $oProperty)
{
// Св-во может иметь несколько значений
$aPropertiesValue = Core_Array::getGet('property_' . $oProperty->id);
if ($aPropertiesValue)
{
!is_array($aPropertiesValue) && $aPropertiesValue = array($aPropertiesValue);
foreach ($aPropertiesValue as $sPropertyValue)
{
$aTmpProperties[] = array($oProperty, strval($sPropertyValue));
}
}
elseif (!is_null(Core_Array::getGet('property_' . $oProperty->id . '_from')))
{
$tmpFrom = Core_Array::getGet('property_' . $oProperty->id . '_from');
$tmpTo = Core_Array::getGet('property_' . $oProperty->id . '_to');
!is_array($tmpFrom) && $tmpFrom = array($tmpFrom);
!is_array($tmpTo) && $tmpTo = array($tmpTo);
// From ... to ...
foreach ($tmpFrom as $iKey => $sValue)
{
$to = Core_Array::get($tmpTo, $iKey);
$aTmpProperties[] = array($oProperty, array(
'from' => $sValue != ''
? ($oProperty->type == 11 ? floatval($sValue) : intval($sValue))
: '',
'to' => $to != ''
? ($oProperty->type == 11 ? floatval($to) : intval($to))
: ''
));
}
}
}
if (count($aTmpProperties))
{
reset($aTmpProperties);
while(list(, list($oProperty, $propertyValue)) = each($aTmpProperties))
{
$tableName = $oProperty->createNewValue(0)->getTableName();
$Shop_Controller_Show->shopItems()->queryBuilder()
->where('shop_item_properties.property_id', '=', $oProperty->id);
if (!is_array($propertyValue))
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id)->value($propertyValue)
);
$Shop_Controller_Show->addCacheSignature("property{$oProperty->id}={$propertyValue}");
}
else
{
$from = trim(Core_Array::get($propertyValue, 'from'));
$to = trim(Core_Array::get($propertyValue, 'to'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id . '_from')->value($from)
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id . '_to')->value($to)
);
$Shop_Controller_Show
->addCacheSignature("property{$oProperty->id}_from={$from}")
->addCacheSignature("property{$oProperty->id}_to={$to}");
}
}
}
$Shop_Controller_Show
->group($iCurrentShopGroup)
->addMinMaxPrice()
->show();
}
}
Core_Page::instance()->execute()
?>
Больше нигде вроде ничего не менял.
<?php
if (filter_input(INPUT_SERVER, 'REQUEST_URI') == '/shop/cart/' or filter_input(INPUT_SERVER, 'REQUEST_URI') == '/shop/') {
}
else {
if (Core::moduleIsActive('shop') && isset(Core_Page::instance()->libParams['shopId']))
{
$oShop = Core_Entity::factory('Shop', Core_Page::instance()->libParams['shopId']);
$Shop_Controller_Show = new Shop_Controller_Show($oShop);
$Shop_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName('МагазинФильтр')
)
->groupsMode('tree')
->limit(0)
->itemsProperties(TRUE);
if (is_object(Core_Page::instance()->object)
&& get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
{
$Shop_Controller_Show->group(Core_Page::instance()->object->group);
$iCurrentShopGroup = Core_Page::instance()->object->group;
}
else
{
$iCurrentShopGroup = 0;
}
$price_from = intval(Core_Array::getGet('price_from'));
$price_to = intval(Core_Array::getGet('price_to'));
if ($price_from)
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('price_from')->value($price_from)
);
$Shop_Controller_Show->addCacheSignature('price_from=' . $price_from);
}
if ($price_to)
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('price_to')->value($price_to)
);
$Shop_Controller_Show->addCacheSignature('price_to=' . $price_to);
}
//Sorting
if (Core_Array::getGet('sorting'))
{
$sorting = intval(Core_Array::getGet('sorting'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('sorting')->value($sorting)
);
$Shop_Controller_Show->addCacheSignature('sorting=' . $sorting);
}
//Producers
if (Core_Array::getGet('producer_id'))
{
$iProducerId = intval(Core_Array::getGet('producer_id'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('producer_id')->value($iProducerId)
);
$Shop_Controller_Show->addCacheSignature('producer_id=' . $iProducerId);
}
// Additional properties
$oShop_Item_Property_List = Core_Entity::factory('Shop_Item_Property_List', $oShop->id);
$aProperties = $oShop_Item_Property_List->Properties->findAll();
$aTmpProperties = array();
foreach ($aProperties as $oProperty)
{
// Св-во может иметь несколько значений
$aPropertiesValue = Core_Array::getGet('property_' . $oProperty->id);
if ($aPropertiesValue)
{
!is_array($aPropertiesValue) && $aPropertiesValue = array($aPropertiesValue);
foreach ($aPropertiesValue as $sPropertyValue)
{
$aTmpProperties[] = array($oProperty, strval($sPropertyValue));
}
}
elseif (!is_null(Core_Array::getGet('property_' . $oProperty->id . '_from')))
{
$tmpFrom = Core_Array::getGet('property_' . $oProperty->id . '_from');
$tmpTo = Core_Array::getGet('property_' . $oProperty->id . '_to');
!is_array($tmpFrom) && $tmpFrom = array($tmpFrom);
!is_array($tmpTo) && $tmpTo = array($tmpTo);
// From ... to ...
foreach ($tmpFrom as $iKey => $sValue)
{
$to = Core_Array::get($tmpTo, $iKey);
$aTmpProperties[] = array($oProperty, array(
'from' => $sValue != ''
? ($oProperty->type == 11 ? floatval($sValue) : intval($sValue))
: '',
'to' => $to != ''
? ($oProperty->type == 11 ? floatval($to) : intval($to))
: ''
));
}
}
}
if (count($aTmpProperties))
{
reset($aTmpProperties);
while(list(, list($oProperty, $propertyValue)) = each($aTmpProperties))
{
$tableName = $oProperty->createNewValue(0)->getTableName();
$Shop_Controller_Show->shopItems()->queryBuilder()
->where('shop_item_properties.property_id', '=', $oProperty->id);
if (!is_array($propertyValue))
{
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id)->value($propertyValue)
);
$Shop_Controller_Show->addCacheSignature("property{$oProperty->id}={$propertyValue}");
}
else
{
$from = trim(Core_Array::get($propertyValue, 'from'));
$to = trim(Core_Array::get($propertyValue, 'to'));
$Shop_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id . '_from')->value($from)
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('property_' . $oProperty->id . '_to')->value($to)
);
$Shop_Controller_Show
->addCacheSignature("property{$oProperty->id}_from={$from}")
->addCacheSignature("property{$oProperty->id}_to={$to}");
}
}
}
$Shop_Controller_Show
->group($iCurrentShopGroup)
->addMinMaxPrice()
->show();
}
}
Core_Page::instance()->execute()
?>
Больше нигде вроде ничего не менял.
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
перед
добавляете:
в XML в /shop/producers/shop_producer будут ваши производители
$Shop_Controller_Show
->group($iCurrentShopGroup)
->addMinMaxPrice()
->show();
->group($iCurrentShopGroup)
->addMinMaxPrice()
->show();
добавляете:
$oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oProducersXmlEntity);
// Список производителей
$aShop_Producers = $oShop->Shop_Producers->findAll(FALSE);
foreach ($aShop_Producers as $oShop_Producer)
{
// Добавляем производителя потомком XML-сущности
$oProducersXmlEntity->addEntity(
$oShop_Producer->clearEntities()
);
}
// Добавляем XML-сущность контроллеру показа
$Shop_Controller_Show->addEntity($oProducersXmlEntity);
// Список производителей
$aShop_Producers = $oShop->Shop_Producers->findAll(FALSE);
foreach ($aShop_Producers as $oShop_Producer)
{
// Добавляем производителя потомком XML-сущности
$oProducersXmlEntity->addEntity(
$oShop_Producer->clearEntities()
);
}
в XML в /shop/producers/shop_producer будут ваши производители
Авторизация