Добавление фильтрации по производителю в магазине

Модератор
#
Re: Добавление фильтрации по производителю в магазине
inteo писал(а):
производители товаров-ярлыков не попадают в фильтр

Верно. Ярлык - это просто ссылка на товар-родитель. При фильтрации ярлык не имеет каких-либо данных родительского товара.

Теоретически можно реализовать, придется значительно менять запрос в контроллере товара.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Добавление фильтрации по производителю в магазине
Да, забыли добавить, чтобы фильтр по производителям не сбрасывался при переходе на следующую страницу, необходимо
между
amp;sorting=<xsl:value-of select="/shop/sorting"/>

и
&amp;price_from=<xsl:value-of select="/shop/price_from"/>

в секции формирования пагинации (XSL)
вставить
&amp;producer_id=<xsl:value-of select="/shop/producer_id"/>

без пробелов:
&amp;sorting=<xsl:value-of select="/shop/sorting"/>&amp;producer_id=<xsl:value-of select="/shop/producer_id"/>&amp;price_from=<xsl:value-of select="/shop/price_from"/>

мелочь, но для полноты решения необходимо...
Знания имеют свои пределы, и только глупость человеческая не знает границ...
#
Re: Добавление фильтрации по производителю в магазине
alexpimnev писал(а):
Фильтр производителей сделал вместо select чекбоксами, для множественного выбора
заменил в ТДС "Интернет-магазин" в коде страницы, этот код
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->shopItems()
->queryBuilder()
->select('shop_items.*'
->where('shop_items.shop_producer_id', '=', $iProducerId);
}


на этот
if (Core_Array::getGet('producer_id')
{
$iProducersValue = Core_Array::getGet('producer_id';
//var_dump($iProducersValue);
$cnt=0;

            
             foreach ($iProducersValue as $ProducerValue)
             {
                $Shop_Controller_Show->addEntity(
                Core::factory('Core_Xml_Entity'
                ->name('producer_id'->value(intval($ProducerValue))
                                        );
                
                if ($cnt>0)$Shop_Controller_Show->shopItems()->queryBuilder()
                   ->setOr();
                
                $Shop_Controller_Show->shopItems()
                ->queryBuilder()
                ->select('shop_items.*'
                ->where('shop_items.shop_producer_id', '=', intval($ProducerValue));
                              
                $cnt++;
                }
            

}

но он выдает ошибку Предупреждение: Invalid argument supplied for foreach() в файле /home/virtwww/w_atm-st63f_48599230/http/hostcmsfiles/lib/lib_6/lib_6.php (строка 54)

пробовал
->where('shop_items.shop_producer_id', '=', intval($ProducerValue));
заменить на
->where('shop_items.shop_producer_id', 'IN', $array);
но выдает ту же самую ошибку, какой правильный все такие код для множественного фильтра по производителю?

Подскажите пожалуйста как исправить эту ошибку
#
Re: Добавление фильтрации по производителю в магазине
Цитата:

$oShop_Producers->queryBuilder()
->select('shop_producers.*'
->distinct()
->join('shop_items', 'shop_items.shop_producer_id', '=', 'shop_producers.id'
->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
->where('shop_items.deleted', '=', 0);


Можно как то добавить обработку ярлыков товаров?
При этой выборке они игнорируются.


#
Re: Добавление фильтрации по производителю в магазине
Кто-нибудь смог реализовать обработку ярлыков? Тоже понадобилось данное решение.
#
Re: Добавление фильтрации по производителю в магазине
Уже третий клиент сношает за то что не идет фильтр по ярлыкам) Ему же просто не объяснишь, что это просто ссылка на товар.
Может быть тех поддержка подскажет в каком именно контроллере копаться и примерный алгоритм что добавить туда? modules/shop/controller/show.php function show()?
Сделать хотя бы сортировку по цене и производителям.
#
Re: Добавление фильтрации по производителю в магазине
Данный способ фильтра по производителям не работает в адаптивном шаблоне, все сделал как написано, вот итог - http://soft-crimea.ru/shop/antivirus/лаборатория_касперского/. Фильтр не работает.
В XSL-шаблоне отсутствует строчка <div class="sorting">, а вот что есть:

      <!-- дополнение пути для 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-horizontal">
         <div class="filter">
            <div class="form-group">
               <div class="col-lg-12">
               <select name="sorting" class="form-control" 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="col-lg-12">
<!-- Если есть доступные производители -->
<xsl:if test="count(producers/shop_producer) > 0">
Производитель:
<select name="producer_id">
<option value="0">…</option>
<xsl:apply-templates select="producers/shop_producer"/>
</select>
</xsl:if>
</div>
            </div>
#
Re: Добавление фильтрации по производителю в магазине
Присоединяюсь к последнему вопросу, помогите привязать сортировку по производителю к адаптивному шаблону, пожалуйста!
Если добавить всё как есть в шаблон для фильтра, не работает, потому что...?
#
Re: Добавление фильтрации по производителю в магазине
В общем, столкнувшись с тем, что сортировка по производителям у меня тоже не запустилась, начал пристальнее разглядывать код и сравнивать его с одним листингом с форума.
В итоге наткнулся на такой момент - в первом  посте в коде на первом шаге есть строка
$aShop_Producers = $oShop_Producers->findAll();

Сравнил ее с тем, что нашел на форуме:
$aShop_Producers = $oShop->Shop_Producers->findAll();

Попробовал вставить так и, собственно все получилось

Фильтр у меня выводится в левом блоке, не в ТДС, поэтому могу привести листинг левого блока адаптивного шаблона:
<?php
// Разделы магазина
if (Core::moduleIsActive('shop'))
{
   $Shop_Controller_Show = new Shop_Controller_Show(
      Core_Entity::factory('Shop', 3)
   );
   $Shop_Controller_Show
      ->xsl(
         Core_Entity::factory('Xsl')->getByName('МагазинГруппыТоваровНаГлавнойСайт2')
      )
      ->groupsMode('all')
      ->limit(0);

   if (is_object(Core_Page::instance()->object)
   && get_class(Core_Page::instance()->object) == 'Shop_Controller_Show')
   {
      $Shop_Controller_Show->addEntity(
        Core::factory('Core_Xml_Entity')
          ->name('current_group_id')
          ->value(intval(Core_Page::instance()->object->group))
      );
   }

   $Shop_Controller_Show->show();

   // Фильтр справа
   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('МагазинФильтрСайт2')
         )
         ->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
      $oShop = $Shop_Controller_Show->getEntity();
      
      // XML-сущность, к которй будут добавляться производители
      $oProducersXmlEntity = Core::factory('Core_Xml_Entity')->name('producers');
      // Добавляем XML-сущность контроллеру показа
      $Shop_Controller_Show->addEntity($oProducersXmlEntity);

      // Список производителей
      $oShop_Producers = $oShop->Shop_Producers;
      $oShop_Producers->queryBuilder()
         ->select('shop_producers.*')
         ->distinct()
         ->join('shop_items', 'shop_items.shop_producer_id', '=', 'shop_producers.id')
         ->where('shop_items.shop_group_id', '=', $Shop_Controller_Show->group)
         ->where('shop_items.deleted', '=', 0);

      $aShop_Producers = $oShop->Shop_Producers->findAll();
      foreach ($aShop_Producers as $oShop_Producer)
      {
         // Добавляем производителя потомком XML-сущности
         $oProducersXmlEntity->addEntity(
         $oShop_Producer->clearEntities()
         );
      }
      
      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->shopItems()
               ->queryBuilder()
               ->select('shop_items.*')
               ->where('shop_items.shop_producer_id', '=', $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}");
            }
         }
      }

      /* Количество */
      $on_page = intval(Core_Array::getGet('on_page'));
      if ($on_page > 0 && $on_page < 150)
      {
         $Shop_Controller_Show->addEntity(
            Core::factory('Core_Xml_Entity')
               ->name('on_page')->value($on_page)
         );
      }

      $Shop_Controller_Show
         ->group($iCurrentShopGroup)
         ->addMinMaxPrice()
         ->show();
   }
   ?>


Там после комментария Producers идет фильтр с выводом производителей и, как в примере, проверка на выбранного производителя для подсветки в селектбоксе.
Просьба разработчикам поправить, если не прав)
#
Re: Добавление фильтрации по производителю в магазине
Стоит отметить, что данная конструкция
$aShop_Producers = $oShop->Shop_Producers->findAll();

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