How To: Вывод информационных элементов из текущей группы и ее подгрупп

Для вывода товаров из подгрупп достаточно указать контроллеру опцию ->subgroups(TRUE)

$Informationsystem_Controller_Show->subgroups(TRUE);

Использование subgroups(TRUE) доступно при указании в group() идентификатора родительской группы, если в group() будет указан массив, subgroups(TRUE) не будет иметь действия.

Для версии до 6.9.7

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

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', '=', 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 Informationsystem_Controller_Show($oInformationsystem);


Сама строка

$Informationsystem_Controller_Show = new Informationsystem_Controller_Show($oInformationsystem);

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

$Informationsystem_Controller_Show = new My_Informationsystem_Controller_Show($oInformationsystem);

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.

Комментарии

  • Без темы

    добавьте Инфу про subgroups(TRUE)

    30.09.2021 13:14:37
    Puma
  • Без темы

    Как сделать что бы показывало из корня уже все группы ?

    29.09.2016 10:29:26
    Dremlin

    Без темы

    Чтобы контроллер показывал все группы:
    http://www.hostcms.ru/api6/class-Shop_Controller_Show.html
    * groupsMode('tree') режим показа групп, может принимать следующие значения: none - не показывать группы, tree - показывать дерево групп и все группы на текущем уровне (по умолчанию), all - показывать все группы.

    29.09.2016 10:46:22
    hostcms

    Без темы

    и элементы)

    29.09.2016 10:29:47
    Dremlin

    Без темы

    чтобы показывало все элементы из всех групп, нужно указать в качестве группы ->group(FALSE) и указать количество элементов ->limit(9999)
    только нужно понимать, что вывод 9999 теоретически никогда не понадобится.

    29.09.2016 10:47:25
    hostcms

    Без темы

    в коде так и поставил

    $Informationsystem_Controller_Show
    ->xsl(
    Core_Entity::factory('Xsl')->getByName($xslName)
    )
    ->itemsProperties(TRUE)
    ->group(FALSE)
    ->limit(9999)
    ->show();


    но показывает все равно из корня только группы.. без элементов
    если зайти в группу то все хорошо.. все элементы и группы..
    а вот из корня не хочет

    29.09.2016 10:58:35
    Dremlin

    Без темы

    Ответ про groupsMode() вы проигнорировали! ->groupsMode('all') выберет все группы

    29.09.2016 10:59:42
    hostcms

    Без темы

    нет, пробовал.. история та же самая.. с группами проблем нет.
    не выбирает элементы к группам

    29.09.2016 11:02:52
    Dremlin

    Без темы

    все элементы в корне, они не будут в теге групп! По остальным вопросам, пожалуйста, в обращайтесь поддержку.

    29.09.2016 11:05:04
    hostcms
  • Без темы

    Как сделать что бы показывало из корня уже все группы ?

    29.09.2016 10:13:34
    Dremlin
  • Очепятка

    "Код класса добавляется в настройки типовой динамической страницы магазина перед:"
    Это же ИС а не ИМ

    15.03.2016 15:20:43
    TrywaR

    Без темы

    Спасибо. Исправлено.

    15.03.2016 15:23:33
    alexander.egorov