This is an old revision of the document!
На странице редактирования информационного элемента (или товара) в центре администрирования создадим вкладку «Группы», на которой будет выводится иерархический список групп информационной системы. Возле каждой группы пусть отображается чекбокс, который означает должен ли существовать ярлык элемента в этой группе.
Для размещения вкладки на странице редактирования информационных элементов будем использовать событие контроллера форм:
Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm
(6.5.2+),
…а для сохранения ярлыков событие:
Admin_Form_Action_Controller_Type_Edit.onAfterExecute
.
Для размещения вкладки на странице редактирования товаров используем событие:
Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm
…для сохранения аналогично:
Admin_Form_Action_Controller_Type_Edit.onAfterExecute
.
Чтобы все работало понадобится следующий код в файле bootstrap.php
:
// KAD: Управления ярлыками элементов информационной системы в отдельной вкладке // Событие onAfterRedeclaredPrepareForm работает начиная с версии 6.5.2 Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm', array('Kad_Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onAfterRedeclaredPrepareForm')); Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute',array('Kad_Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onAfterExecute')); // KAD: Управления ярлыками товара в отдельной вкладке Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onBeforeExecute', array('Kad_Admin_Form_Observer_ShortcutsTab_Shop', 'onBeforeExecute')); Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute', array('Kad_Admin_Form_Observer_ShortcutsTab_Shop', 'onAfterExecute'));
…а также наблюдатели (скачать файлом):
<?php /* * Управления ярлыками в отдельной вкладке * * Базовый класс для информационныой системы и магазина * * @author Maxim Zasorin, KAD Systems (©) * @date 13-01-2016 * * Копирование и использование файлов модуля * в коммерческих целях ЗАПРЕЩЕНО * */ defined('HOSTCMS') || exit('HostCMS: access denied.'); abstract class Kad_Admin_Form_Observer_ShortcutsTab { static protected $_shortcutsGroups = array(); // Добавляет вкладку с ярлыками static protected function shortcutsTab($controller, $object) { $oItemShortcutsTab = Admin_Form_Entity::factory('Tab') ->caption( Core_I18n::instance()->getLng() == 'ru' ? 'Группы' : 'Groups' ) ->name('shortcuts_groups'); $controller->addTabBefore( $oItemShortcutsTab, $controller->getTab('additional') ); static::addGroupsToTab($oItemShortcutsTab, $object); } // Добавляет все группы на вкладку с ярлыками static protected function addGroupsToTab($oShopItemShortcutsTab, $object) { $aoModuleGroups = static::getModuleGroups($object); foreach ($aoModuleGroups as $oModuleGroup) { static::addGroupToTab($oShopItemShortcutsTab, $object, $oModuleGroup); } } // Добавляет одну группы на вкладку с ярлыками static protected function addGroupToTab($oShopItemShortcutsTab, $object, $oModuleGroup, $level = 0) { $oShopItemShortcutsTabGroupRow = Admin_Form_Entity::factory('Div') ->class('row') ->style('padding-left: ' . (25 * $level) . 'px'); $oShopItemShortcutsTab->add($oShopItemShortcutsTabGroupRow); $oModuleGroupCheckbox = Admin_Form_Entity::factory('Checkbox'); $oModuleGroupCheckbox ->value( in_array($oModuleGroup->id, static::getShortcutsGroups($object)) ? 1 : 0 ) ->caption($oModuleGroup->name) ->name('shortcut_group_' . $oModuleGroup->id) ->divAttr(array('class' => 'form-group col-lg-6 col-md-6 col-sm-6')) ; if (static::getObjectGroupId($object, true) == $oModuleGroup->id) { $oModuleGroupCheckbox->disabled = 'disabled'; } $oShopItemShortcutsTabGroupRow->add($oModuleGroupCheckbox); $aoChildGroups = static::getChildGroups($oModuleGroup)->findAll(); foreach ($aoChildGroups as $oChildGroup) { static::addGroupToTab($oShopItemShortcutsTab, $object, $oChildGroup, $level + 1); } } // Возвращает группы, в которых присутствую ярлыки объекта static protected function getShortcutsGroups($object) { if (count(self::$_shortcutsGroups) > 0) { return self::$_shortcutsGroups; } $aoShortcuts = static::getShortcuts($object)->findAll(); // $aShortcutsGroups = array(); $aShortcutsGroups = array(static::getObjectGroupId($object, true)); foreach ($aoShortcuts as $oShortcut) { $aShortcutsGroups[] = static::getObjectGroupId($oShortcut); } return (self::$_shortcutsGroups = $aShortcutsGroups); } // Сохраняем ярлыки групп static protected function saveShortcuts($controller, $object) { $aoModuleGroups = static::getModuleGroups($object, true); foreach ($aoModuleGroups as $oModuleGroup) { $oGroupShortcuts = static::getShortcuts($object, $oModuleGroup); $aoGroupShortcuts = $oGroupShortcuts->findAll(); if (Core_Array::getPost('shortcut_group_' . $oModuleGroup->id)) { if (count($aoGroupShortcuts) == 0) { $object->shortcut($oModuleGroup->id); } } else { foreach ($aoGroupShortcuts as $oGroupShortcut) { $oGroupShortcut->delete(); } } } } // Возвращает подгруппы abstract static protected function getChildGroups($oGroup); // Возвращает все группы текущего модуля abstract static protected function getModuleGroups($object, $all = false); // Возвращает группу объекта abstract static protected function getObjectGroupId($object, $original = false); // Возвращает ярлыки объекта abstract static protected function getShortcuts($object, $oGroup = null); }
<?php /* * Управления ярлыками элементов информационной системы в отдельной вкладке * * @author Maxim Zasorin, KAD Systems (©) * @date 13-01-2016 * * * В bootstrap.php: * // KAD: Управления ярлыками элементов информационной системы в отдельной вкладке // Событие onAfterRedeclaredPrepareForm работает начиная с версии 6.5.2 Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm', array('Kad_Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onAfterRedeclaredPrepareForm')); Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute', array('Kad_Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onAfterExecute')); * Копирование и использование файлов модуля * в коммерческих целях ЗАПРЕЩЕНО * */ defined('HOSTCMS') || exit('HostCMS: access denied.'); class Kad_Admin_Form_Observer_ShortcutsTab_Informationsystem extends Kad_Admin_Form_Observer_ShortcutsTab { // Событие static public function onAfterRedeclaredPrepareForm($controller, $args) { list($object, $Admin_Form_Controller) = $args; // Данное событие будет вызываться для всех форм, определяем с каким контроллером работаем switch (get_class($controller)) { case 'Informationsystem_Item_Controller_Edit': if (get_class($object) == 'Informationsystem_Item_Model') { self::shortcutsTab($controller, $object); } break; } } // Обрабатываем операцию сохранения формы static public function onAfterExecute($controller, $args) { list($operation, $Admin_Form_Controller) = $args; if ($operation == 'save' || $operation == 'apply') { $object = $controller->getObject(); switch (get_class($controller)) { case 'Informationsystem_Item_Controller_Edit': if (get_class($object) == 'Informationsystem_Item_Model') { self::saveShortcuts($controller, $object); } break; } } } static protected function getChildGroups($oGroup) { return $oGroup->Informationsystem_Groups; } static protected function getModuleGroups($object, $all = false) { $oModuleGroups = $object->Informationsystem->Informationsystem_Groups; $oModuleGroups->queryBuilder() ->where('active', '=', 1) ->where('deleted', '=', 0); if (!$all) { $oModuleGroups->queryBuilder()->where('parent_id', '=', 0); } return $oModuleGroups->findAll(); } static protected function getObjectGroupId($object, $original = false) { if ($object->shortcut_id != 0 && $original) { $object = $object->Informationsystem_Item; } return $object->informationsystem_group_id; } static protected function getShortcuts($object, $oGroup = null) { if ($object->shortcut_id == 0) { $oShortcuts = $object->Informationsystem_Items; } else { $oShortcuts = $object->Informationsystem_Item->Informationsystem_Items; } if ($oGroup) { $oShortcuts->queryBuilder() ->where('informationsystem_group_id', '=', $oGroup->id); } return $oShortcuts; } }
<?php /* * Управления ярлыками товара в отдельной вкладке * * @author Maxim Zasorin, KAD Systems (©) * @date 13-01-2016 * * * В bootstrap.php: * // KAD: Управления ярлыками товара в отдельной вкладке Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onBeforeExecute', array('Kad_Admin_Form_Observer_ShortcutsTab_Shop', 'onBeforeExecute')); Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute', array('Kad_Admin_Form_Observer_ShortcutsTab_Shop', 'onAfterExecute')); * Копирование и использование файлов модуля * в коммерческих целях ЗАПРЕЩЕНО * */ defined('HOSTCMS') || exit('HostCMS: access denied.'); class Kad_Admin_Form_Observer_ShortcutsTab_Shop extends Kad_Admin_Form_Observer_ShortcutsTab { // Событие static public function onBeforeExecute($controller, $args) { list($operation, $Admin_Form_Controller) = $args; if (is_null($operation)) { switch (get_class($controller)) { case 'Shop_Item_Controller_Edit': $object = $controller->getObject(); if (get_class($object) == 'Shop_Item_Model') { self::shortcutsTab($controller, $object); } break; } } } // Обрабатываем операцию сохранения формы static public function onAfterExecute($controller, $args) { list($operation, $Admin_Form_Controller) = $args; if ($operation == 'save' || $operation == 'apply') { $object = $controller->getObject(); switch (get_class($controller)) { case 'Shop_Item_Controller_Edit': if (get_class($object) == 'Shop_Item_Model') { self::saveShortcuts($controller, $object); } break; } } } static protected function getChildGroups($oGroup) { return $oGroup->Shop_Groups; } static protected function getModuleGroups($object, $all = false) { $oModuleGroups = $object->Shop->Shop_Groups; $oModuleGroups->queryBuilder() ->where('active', '=', 1) ->where('deleted', '=', 0); if (!$all) { $oModuleGroups->queryBuilder()->where('parent_id', '=', 0); } return $oModuleGroups->findAll(); } static protected function getObjectGroupId($object, $original = false) { if ($object->shortcut_id != 0 && $original) { $object = $object->Shop_Item; } return $object->shop_group_id; } static protected function getShortcuts($object, $oGroup = null) { if ($object->shortcut_id == 0) { $oShortcuts = $object->Shop_Items; } else { $oShortcuts = $object->Shop_Item->Shop_Items; } if ($oGroup) { $oShortcuts->queryBuilder() ->where('shop_group_id', '=', $oGroup->id); } return $oShortcuts; } }