HostCMS активность группы и её подгрупп
При отключении активности группы, если в группе есть подгруппы то они остаются активными, тогда это активность отключается только для текущей группы. По этому иногда это приводит к путанице тем что у группы и её подгруппы активные но их родитель активности не имеет. Но контент менеджерам такое объяснить сложно и долго, что при отключении главной группы необходимо отключить все связанные её подгруппы и товары в том числе. Что бы упростить задачу решил написать Хук и поделиться с решением.
Отключаем активность группы и её подгрупп
1. Создаем класс наблюдателя, размещаем его в modules/shop/group/observer.php
class Shop_Group_Observer
{
static public function onAfterChangeActive($object, $args)
{
if ($object->active <= 0) {
$aSubGroupsID = self::fillShopGroup($object->shop_id, $object->id);
array_unshift($aSubGroupsID, $object->id);
$oGroups_Update = Core_QueryBuilder::update('shop_groups')
->set('active', 0)
->where('shop_id', '=', $object->shop_id)
->where('id', 'IN', $aSubGroupsID)
->execute();
$oItems_Update = Core_QueryBuilder::update('shop_items')
->set('active', 0)
->where('shop_id', '=', $object->shop_id)
->where('shop_group_id', 'IN', $aSubGroupsID)
->execute();
}
}
static public function onAfterExecute($controller, $args)
{
list($operation, $Admin_Form_Controller) = $args;
if (!is_null($operation))
{
// Данное событие будет вызываться для всех форм, определяем с каким контроллером работаем
switch (get_class($controller))
{
case 'Shop_Item_Controller_Edit':
$object = $controller->getObject();
// Определяем с какой моделью работаем
switch ($object->getModelName())
{
case 'shop_group':
if ($object->active <= 0) {
$aSubGroupsID = self::fillShopGroup($object->shop_id, $object->id);
array_unshift($aSubGroupsID, $object->id);
$oGroups_Update = Core_QueryBuilder::update('shop_groups')
->set('active', 0)
->where('shop_id', '=', $object->shop_id)
->where('id', 'IN', $aSubGroupsID)
->execute();
$oItems_Update = Core_QueryBuilder::update('shop_items')
->set('active', 0)
->where('shop_id', '=', $object->shop_id)
->where('shop_group_id', 'IN', $aSubGroupsID)
->execute();
}
break;
}
break;
}
}
}
static protected $_aGroupTree = array();
static 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)
{
self::$_aGroupTree[$aGroup['parent_id']][] = $aGroup;
}
}
$aReturn = array();
if (isset(self::$_aGroupTree[$iShopGroupParentId]))
{
foreach (self::$_aGroupTree[$iShopGroupParentId] as $childrenGroup)
{
$aReturn[] = $childrenGroup['id'];
$aReturn = array_merge($aReturn, self::fillShopGroup($iShopId, $childrenGroup['id'], $iLevel + 1));
}
}
$iLevel == 0 && self::$_aGroupTree = array();
return $aReturn;
}
}
2. Добавляем наблюдателя в bootstrap.php
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute', array('Shop_Group_Observer', 'onAfterExecute'));
Core_Event::attach('shop_group.onAfterChangeActive', array('Shop_Group_Observer', 'onAfterChangeActive'));