Skip to content

Instantly share code, notes, and snippets.

@maximzasorin
Last active July 22, 2020 23:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maximzasorin/b77610939b5da0ebae47 to your computer and use it in GitHub Desktop.
Save maximzasorin/b77610939b5da0ebae47 to your computer and use it in GitHub Desktop.
Управление ярлыками товаров и элементов информационной системы в отдельной вкладке (HostCMS)
<?php
/*
* Управление ярлыками элементов информационной системы в отдельной вкладке
*
* В bootstrap.php:
*
// Управление ярлыками элементов информационной системы в отдельной вкладке
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onBeforeExecute',array('Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onBeforeExecute'));
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterRedeclaredPrepareForm', array('Admin_Form_Observer_ShortcutsTab_Informationsystem', 'onAfterRedeclaredPrepareForm'));
*
*/
defined('HOSTCMS') || exit('HostCMS: access denied.');
class Admin_Form_Observer_ShortcutsTab_Informationsystem extends 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)
{
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
/*
* Управление ярлыками товара в отдельной вкладке
*
* В bootstrap.php:
*
// Управление ярлыками товара в отдельной вкладке
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onBeforeExecute', array('Admin_Form_Observer_ShortcutsTab_Shop', 'onBeforeExecute'));
Core_Event::attach('Admin_Form_Action_Controller_Type_Edit.onAfterExecute', array('Admin_Form_Observer_ShortcutsTab_Shop', 'onAfterExecute'));
*
*/
defined('HOSTCMS') || exit('HostCMS: access denied.');
class Admin_Form_Observer_ShortcutsTab_Shop extends 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)
{
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;
}
}
<?php
/*
* Управление ярлыками в отдельной вкладке
*
* Базовый класс для информационныой системы и магазина
*
*/
defined('HOSTCMS') || exit('HostCMS: access denied.');
abstract class 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');
if ($controller->issetTab('additional'))
{
$controller->addTabBefore(
$oItemShortcutsTab,
$controller->getTab('additional')
);
}
else
{
$controller->addTab($oItemShortcutsTab);
}
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) == $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));
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);
// Возвращает ярлыки объекта
abstract static protected function getShortcuts($object, $oGroup = null);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment