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);
Комментарии
-
Без темы
Как сделать что бы показывало из корня уже все группы ?
Без темы
Чтобы контроллер показывал все группы:
http://www.hostcms.ru/api6/class-Shop_Controller_Show.html
* groupsMode('tree') режим показа групп, может принимать следующие значения: none - не показывать группы, tree - показывать дерево групп и все группы на текущем уровне (по умолчанию), all - показывать все группы.Без темы
и элементы)
Без темы
чтобы показывало все элементы из всех групп, нужно указать в качестве группы ->group(FALSE) и указать количество элементов ->limit(9999)
только нужно понимать, что вывод 9999 теоретически никогда не понадобится.Без темы
в коде так и поставил
$Informationsystem_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
->itemsProperties(TRUE)
->group(FALSE)
->limit(9999)
->show();
но показывает все равно из корня только группы.. без элементов
если зайти в группу то все хорошо.. все элементы и группы..
а вот из корня не хочетБез темы
Ответ про groupsMode() вы проигнорировали! ->groupsMode('all') выберет все группы
-
Очепятка
"Код класса добавляется в настройки типовой динамической страницы магазина перед:"
Это же ИС а не ИМ