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'));
  • 9 463 просмотра