Фильтровать по производителю

#
Фильтровать по производителю
Добрый день форумчане, подскажите как добавить в фильтр возможность фильтровать по производителю.

В данный момент реализовал это путем добавления поля в шаблон xsl, но есть минусы:

- постоянно надо править выпадающий список с производителями так как поле создано вручную;
- в независимости от категории товара там отображаются все производители, а хотелось бы что бы там отображались только те производители чей товар есть в открытой категории;

Как это можно реализовать подскажите пожалуйста.
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
Модератор
#
Re: Фильтровать по производителю
1. Проверяете наличие данных в XML, если нет, включаете их вывод через контроллер или добавляете производителей контроллеру на PHP.
2. В XSL-шаблоне используете эти данные.
#
Re: Фильтровать по производителю
А примера случаем нет )
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
Модератор
#
Re: Фильтровать по производителю
maiborodava,
как вы фильтр показываете? Покажите код.
#
Re: Фильтровать по производителю
В 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>
e-mail: webmaster@maiboroda.pro / maiboroda.pro / Создание и поддержка сайтов / г. Ставрополь
#
Re: Фильтровать по производителю
Вот так:


<?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 / Создание и поддержка сайтов / г. Ставрополь
Модератор
#
Re: Фильтровать по производителю
1. Это не PHP.
2. Откуда у вас в фильтре вообще взялся shop_item?
#
Re: Фильтровать по производителю
Ну через настройки ТДС пробовал вот так:


$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 / Создание и поддержка сайтов / г. Ставрополь
#
Re: Фильтровать по производителю
В самом шаблоне вот так:


      <?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 / Создание и поддержка сайтов / г. Ставрополь
Модератор
#
Re: Фильтровать по производителю
перед
                                 $Shop_Controller_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/producers/shop_producer будут ваши производители
Авторизация