Выдано 109045 лицензий

How To: Вывод товаров из текущей группы и ее подгрупп

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

class My_Shop_Controller_Show extends Shop_Controller_Show
{
    protected function _groupCondition()
    {
        $oShop = $this->getEntity();
    
        if($this->parentItem == 0)
        {
            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);
            }
        }
        else
        {
            
            parent::_groupCondition();
        
        }
 
       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 Shop_Controller_Show($oShop);

заменяется на

$Shop_Controller_Show = new My_Shop_Controller_Show($oShop);

Комментарии

  • Без темы

    Есть решение?

    22.07.2015 11:26:54

    Без темы

    Решение чего?

    22.07.2015 11:46:57 HostCMS
  • xelaxela13

    При таком выводе товаров не работает фильтр товаров

    Фильтр корректно работает только если находишься в последней подгруппе!
    Как исправить?

    12.06.2015 12:51:38 xelaxela13

    Re: При таком выводе товаров не работает фильтр товаров

    В макете где вызывается фильтр надо исправить Shop_Controller_Show на My_Shop_Controller_Show

    28.01.2016 10:26:02 MaxNeh