Выбор товаров из подгрупп независимо от уровня вложенности

Модератор
#
Выбор товаров из подгрупп независимо от уровня вложенности
Добавляется в код настроек типовой динамической страницы магазина перед:

$Shop_Controller_Show = new Shop_Controller_Show($oShop);


Код:

class My_Shop_Controller_Show extends Shop_Controller_Show
{
   protected function _groupCondition()
   {
      $oShop = $this->getEntity();
   
      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 Shop_Controller_Show($oShop); меняется на $Shop_Controller_Show = new My_Shop_Controller_Show($oShop);
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
Помогите пожалуйста!
Всё сделал как здесь описано - товары теперь выводятся, но есть одна проблема - не выводится фильтр по производителям если нахожусь в группе а товары лежат в подгруппах
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
Александр, а не подскажите, какие необходимо внести изменения в ваш код, чтобы ограничить вывод товаров необходимым количеством? Поясню - у меня товары по умолчанию сортируются по популярности (по количеству просмотров) и на группах нет необходимости выводить все товары из вложенных подгрупп, а нужно только первые десять - в итоге получится Топ-10 (Топ-15, Топ-20 и т.д., кому сколько нужно) самых популярных товаров раздела...
yestravel
Модератор
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
В данном решении товары просто выбираются из подгрупп, а разделение их подразумевается на XSL. При таком решении ограничить по N количество товаров из каждой группы не представляется возможным.
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
Ну а если заменить


          $this->shopItems()
             ->queryBuilder()
             ->where('shop_items.shop_group_id', '=', 0);


на

          $this->shopItems()
             ->queryBuilder()
             ->where('shop_items.shop_group_id', 'NOT IN', Core_QueryBuilder::select('id')->from('shop_groups')->where('shop_id', '=', $oShop->id)->where('active', '=', 0));


То и в корне будут выводиться как следует.
Команда разработчиков KAD Systems | Интеграция и нестандартные решения на совесть | Email: info@kad.systems Skype: kad.systems | http://kad.systems/ https://vk.com/kad_sys
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
Для ИС
class My_Informationsystem_Controller_Show extends Informationsystem_Controller_Show
{
   protected function _groupCondition()
   {
      $oInformationsystem = $this->getEntity();
  
      if ($this->group)
      {
         // если ID группы не 0, т.е. не корневая группа
         // получаем подгруппы
         $aSubGroupsID = $this->fillInformationsystemGroup($oInformationsystem->id, $this->group); // добавляем текущую группу в массив
         $aSubGroupsID[] = $this->group;

         $this->informationsystemItems()
            ->queryBuilder()
            ->where('informationsystem_items.informationsystem_group_id', 'IN', $aSubGroupsID); // получаем все товары из подгрупп
      }
      else
      {
         $this->informationsystemItems()
            ->queryBuilder()
            ->where('informationsystem_items.informationsystem_group_id', 'NOT IN', Core_QueryBuilder::select('id')->from('informationsystem_groups')->where('informationsystem_id', '=', $oInformationsystem->id)->where('active', '=', 0));
      }

      return $this;
   }

   protected $_aGroupTree = array();

   public function fillInformationsystemGroup($iInformationsystemId, $iInformationsystemGroupParentId = 0, $iLevel = 0)
   {
      $iInformationsystemId = intval($iInformationsystemId);
      $iInformationsystemGroupParentId = intval($iInformationsystemGroupParentId);
      $iLevel = intval($iLevel);

      if ($iLevel == 0)
      {
         $aTmp = Core_QueryBuilder::select('id', 'parent_id')
            ->from('informationsystem_groups')
            ->where('informationsystem_id', '=', $iInformationsystemId)
            ->where('deleted', '=', 0)
            ->execute()->asAssoc()->result();

         foreach ($aTmp as $aGroup)
         {
            $this->_aGroupTree[$aGroup['parent_id']][] = $aGroup;
         }
      }

      $aReturn = array();

      if (isset($this->_aGroupTree[$iInformationsystemGroupParentId]))
      {
         foreach ($this->_aGroupTree[$iInformationsystemGroupParentId] as $childrenGroup)
         {
            $aReturn[] = $childrenGroup['id'];
            $aReturn = array_merge($aReturn, $this->fillInformationsystemGroup($iInformationsystemId, $childrenGroup['id'], $iLevel + 1));
         }
      }

      $iLevel == 0 && $this->_aGroupTree = array();

      return $aReturn;
   }
}

$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);


Skype:ferdinant1988 ICQ:311960596 E-mail: ferdinant@i.ua
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
alexander.egorov,
интересует вопрос как включить фильтрацию по производителю в группах. в подгруппах фильтр есть, но  для товаров которые дублируются в группу она отсутствует.
www.toolstown.ru
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
После замены $Shop_Controller_Show = new Shop_Controller_Show($oShop); меняется на $Shop_Controller_Show = new My_Shop_Controller_Show($oShop); перестали выводится карточки модификаций
#
Re: Выбор товаров из подгрупп независимо от уровня вложенности
После замены $Shop_Controller_Show = new Shop_Controller_Show($oShop); меняется на $Shop_Controller_Show = new My_Shop_Controller_Show($oShop);  Фильтр перестал работать
#
Re: Re: Выбор товаров из подгрупп независимо от уровня вложенности
Цитата:
После замены $Shop_Controller_Show = new Shop_Controller_Show($oShop); меняется на $Shop_Controller_Show = new My_Shop_Controller_Show($oShop);  Фильтр перестал работать


Присоединяюсь к вопросу. Как реализовать так чтобы работал фильтр
Авторизация