From 8e703090943fc56e9e024dc21397bad121b252d9 Mon Sep 17 00:00:00 2001 From: Artem Yarygin Date: Thu, 14 Jan 2016 02:46:10 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=20ge?= =?UTF-8?q?tSectionFields=20=D0=B8=D0=B7=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B2=20=D1=85=D0=B5=D0=BB=D0=BF=D0=B5=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/helper/AdminBaseHelper.php | 182 ++++++++++++++++++++------------- lib/helper/AdminEditHelper.php | 3 +- lib/helper/AdminListHelper.php | 37 ++++--- 3 files changed, 133 insertions(+), 89 deletions(-) diff --git a/lib/helper/AdminBaseHelper.php b/lib/helper/AdminBaseHelper.php index 82de0c8..b5f15d5 100644 --- a/lib/helper/AdminBaseHelper.php +++ b/lib/helper/AdminBaseHelper.php @@ -67,6 +67,23 @@ * Единственное обязательное условие - расположение всех реализуемых классов админ хелперов и админ интерфейсов * в одном неймспейсе * + * При использовании разделов нужно обязательно прописать в модели элементов привязку к модели разделов, например: + * + * ```php + * [ + * 'data_type' => 'Vendor\Module\CategoryTable', + * 'reference' => ['=this.CATEGORY_ID' => 'ref.ID'], + * ] + * ]; + * } + * ``` + * * @see AdminInterface::fields() * @package AdminHelper * @@ -307,7 +324,7 @@ public static function setInterfaceSettings(array $settings, array $helpers = ar /** * Привязывает класса хелпера из которого вызывается к интерфесу, используется при получении * данных об элементах управления из интерфейса. - * + * * @param $class */ public static function setInterfaceClass($class) @@ -317,7 +334,7 @@ public static function setInterfaceClass($class) /** * Возвращает класс интерфейса к которому привязан хелпер из которого вызван метод. - * + * * @return array */ public static function getInterfaceClass() @@ -330,7 +347,7 @@ public static function getInterfaceClass() * * @param string $module имя текущего модуля * @param $interfaceSettings - * + * * @return bool * @internal */ @@ -361,7 +378,7 @@ public static function registerInterfaceSettings($module, $interfaceSettings) * * @param string $module Модуль, для которого нужно получить настройки. * @param string $view Название представления. - * + * * @return array * @internal */ @@ -379,7 +396,7 @@ public static function getGlobalInterfaceSettings($module, $view) /** * Возвращает имя текущего представления. - * + * * @return string * @api */ @@ -410,9 +427,30 @@ public static function getViewName() return static::$viewName[$className]; } + /** + * Возвращает поле модели которое используется для привязки к разделу из поля с типом совпадающим с классом модели + * раздела. + * @return string + * @throws Exception + */ + public static function getSectionField() + { + $sectionListHelper = static::getHelperClass(AdminSectionListHelper::className()); + $sectionModelClass = $sectionListHelper::getModel(); + $modelClass = static::getModel(); + + foreach ($modelClass::getMap() as $field => $data) { + if ($data['data_type'] === $sectionModelClass) { + return str_replace('=this.', '', key($data['reference'])); + } + } + + throw new Exception('References to section model not found'); + } + /** * Возвращает имя класса используемой модели. - * + * * @return \Bitrix\Main\Entity\DataManager|string * * @throws \Bitrix\Main\ArgumentException @@ -431,9 +469,9 @@ public static function getModel() /** * Возвращает имя модуля. Если оно не задано, то определяет автоматически из namespace класса. - * + * * @return string - * + * * @throws LoaderException * @api */ @@ -442,7 +480,7 @@ public static function getModule() if (!is_array(static::$module)) { return static::$module; } - + $className = get_called_class(); if (!isset(static::$module[$className])) { @@ -470,16 +508,16 @@ public static function getModule() } /** - * Возвращает модифцированный массив с описанием элемента управления по его коду. Берет название и настройки + * Возвращает модифцированный массив с описанием элемента управления по его коду. Берет название и настройки * из админ-интерфейса, если они не заданы — используются значения по умолчанию. - * - * Если элемент управления описан в админ-интерфейсе, то дефолтные настройки и описанные в классе интерфейса + * + * Если элемент управления описан в админ-интерфейсе, то дефолтные настройки и описанные в классе интерфейса * будут совмещены (смержены). - * + * * @param $code * @param $params * @param array $keys - * + * * @return array|bool */ protected function getButton($code, $params, $keys = array('name', 'TEXT')) @@ -489,7 +527,7 @@ protected function getButton($code, $params, $keys = array('name', 'TEXT')) if ($interfaceClass && !empty($interfaceSettings['BUTTONS'])) { $buttons = $interfaceSettings['BUTTONS']; - + if (is_array($buttons) && isset($buttons[$code])) { if ($buttons[$code]['VISIBLE'] == 'N') { return false; @@ -511,11 +549,11 @@ protected function getButton($code, $params, $keys = array('name', 'TEXT')) /** * Возвращает список полей интерфейса. - * + * * @see AdminBaseHelper::setInterfaceSettings() - * + * * @return array - * + * * @api */ public function getFields() @@ -530,7 +568,7 @@ abstract public function show(); /** * Получает название таблицы используемой модели. - * + * * @return mixed */ public function table() @@ -555,11 +593,11 @@ public function pk() } /** - * Возвращает первичный ключ таблицы используемой модели разделов. Для HL-инфоблоков битрикс - всегда ID. + * Возвращает первичный ключ таблицы используемой модели разделов. Для HL-инфоблоков битрикс - всегда ID. * Но может поменяться для какой-либо другой сущности. - * + * * @return string - * + * * @api */ public function sectionPk() @@ -569,9 +607,9 @@ public function sectionPk() /** * Устанавливает заголовок раздела в админке. - * + * * @param string $title - * + * * @api */ public function setTitle($title) @@ -580,12 +618,12 @@ public function setTitle($title) } /** - * Функция для обработки дополнительных операций над элементами в админке. Как правило, должно оканчиваться + * Функция для обработки дополнительных операций над элементами в админке. Как правило, должно оканчиваться * LocalRedirect после внесения изменений. * * @param string $action Название действия. * @param null|int $id ID элемента. - * + * * @api */ protected function customActions($action, $id = null) @@ -595,9 +633,9 @@ protected function customActions($action, $id = null) /** * Выполняется проверка прав на доступ к сущности. - * + * * @return bool - * + * * @api */ protected function hasRights() @@ -607,9 +645,9 @@ protected function hasRights() /** * Выполняется проверка прав на выполнение операций чтения элементов. - * + * * @return bool - * + * * @api */ protected function hasReadRights() @@ -619,9 +657,9 @@ protected function hasReadRights() /** * Выполняется проверка прав на выполнение операций редактирования элементов. - * + * * @return bool - * + * * @api */ protected function hasWriteRights() @@ -631,11 +669,11 @@ protected function hasWriteRights() /** * Проверка прав на изменение определенного элемента. - * + * * @param array $element Массив данных элемента. - * + * * @return bool - * + * * @api */ protected function hasWriteRightsElement($element = array()) @@ -649,9 +687,9 @@ protected function hasWriteRightsElement($element = array()) /** * Выполняется проверка прав на выполнение опреаций удаления элементов. - * + * * @return bool - * + * * @api */ protected function hasDeleteRights() @@ -661,7 +699,7 @@ protected function hasDeleteRights() /** * Выводит сообщения об ошибках. - * + * * @internal */ protected function showMessages() @@ -690,7 +728,7 @@ protected function showMessages() /** * @return bool|\CApplicationException - * + * * @internal */ protected function getLastException() @@ -717,9 +755,9 @@ protected function setAppException($e) /** * Добавляет ошибку или массив ошибок для показа пользователю. - * + * * @param array|string $errors - * + * * @api */ public function addErrors($errors) @@ -738,9 +776,9 @@ public function addErrors($errors) /** * Добавляет уведомление или список уведомлений для показа пользователю. - * + * * @param array|string $notes - * + * * @api */ public function addNotes($notes) @@ -760,7 +798,7 @@ public function addNotes($notes) /** * @return bool|array - * + * * @api */ protected function getErrors() @@ -778,7 +816,7 @@ protected function getErrors() /** * @return bool - * + * * @api */ protected function getNotes() @@ -804,7 +842,7 @@ protected function getNotes() * то это будет вглядеть так $listHelperClass = static::getHelperClass(AdminListHelper::getClass()) * * @param $class - * + * * @return string|bool */ public function getHelperClass($class) @@ -842,7 +880,7 @@ public function getHelperClass($class) /** * Возвращает относительный namespace до хелперов в виде URL параметра. - * + * * @return string */ public static function getEntityCode() @@ -868,11 +906,11 @@ public static function getEntityCode() /** * Возвращает URL страницы редактирования класса данного представления. - * + * * @param array $params - * + * * @return string - * + * * @api */ public static function getEditPageURL($params = array()) @@ -888,17 +926,17 @@ public static function getEditPageURL($params = array()) /** * Возвращает URL страницы редактирования класса данного представления. - * + * * @param array $params - * + * * @return string - * + * * @api */ public static function getSectionsEditPageURL($params = array()) { $sectionEditHelperClass = str_replace('List', 'SectionsEdit', get_called_class()); - + if (empty(static::$sectionsEditViewName) && class_exists($sectionEditHelperClass)) { return $sectionEditHelperClass::getViewURL($sectionEditHelperClass::getViewName(), static::$sectionsEditPageUrl, $params); } @@ -909,17 +947,17 @@ public static function getSectionsEditPageURL($params = array()) /** * Возвращает URL страницы списка класса данного представления. - * + * * @param array $params - * + * * @return string - * + * * @api */ public static function getListPageURL($params = array()) { $listHelperClass = str_replace('Edit', 'List', get_called_class()); - + if (empty(static::$listViewName) && class_exists($listHelperClass)) { return $listHelperClass::getViewURL($listHelperClass::getViewName(), static::$listPageUrl, $params); } @@ -934,9 +972,9 @@ public static function getListPageURL($params = array()) * @param string $viewName Название представления. * @param string $defaultURL Позволяет указать URL напрямую. Если указано, то будет использовано это значение. * @param array $params Дополнительные query-параметры в URL. - * + * * @return string - * + * * @internal */ public static function getViewURL($viewName, $defaultURL, $params = array()) @@ -964,9 +1002,9 @@ public static function getViewURL($viewName, $defaultURL, $params = array()) /** * Возвращает адрес обработчика запросов к админ. интерфейсу. - * + * * @return string - * + * * @api */ public static function getRouterURL() @@ -992,11 +1030,11 @@ public static function getUrl(array $params = array()) * * @param string $code Ключ поля для данного виджета (должен быть в массиве $data). * @param array $data Данные объекта в виде массива. - * + * * @return bool|\DigitalWand\AdminHelper\Widget\HelperWidget - * + * * @throws \DigitalWand\AdminHelper\Helper\Exception - * + * * @internal */ public function createWidgetForField($code, &$data = array()) @@ -1024,7 +1062,7 @@ public function createWidgetForField($code, &$data = array()) } /** - * Метод вызывается при создании виджета для текущего поля. Может быть использован для изменения настроек виджета + * Метод вызывается при создании виджета для текущего поля. Может быть использован для изменения настроек виджета * на основе передаваемых данных. * * @param \DigitalWand\AdminHelper\Widget\HelperWidget $widget @@ -1035,7 +1073,7 @@ protected function onCreateWidgetForField(&$widget, $data = array()) } /** - * Если класс не объявлен, то битрикс генерирует новый класс в рантайме. Если класс уже есть, то возвращаем имя + * Если класс не объявлен, то битрикс генерирует новый класс в рантайме. Если класс уже есть, то возвращаем имя * как есть. * * @param $className @@ -1070,16 +1108,16 @@ public static function getHLEntity($className) * Получает запись из БД с информацией об HL. * * @param string $className Название класса, обязательно без Table в конце и без указания неймспейса. - * + * * @return array|false - * + * * @throws \Bitrix\Main\ArgumentException */ public static function getHLEntityInfo($className) { $className = str_replace('\\', '', $className); $pos = strripos($className, 'Table', -5); - + if ($pos !== false) { $className = substr($className, 0, $pos); } @@ -1096,9 +1134,9 @@ public static function getHLEntityInfo($className) /** * Выставляет текущий контекст исполнения. - * + * * @param $context - * + * * @see $context */ protected function setContext($context) diff --git a/lib/helper/AdminEditHelper.php b/lib/helper/AdminEditHelper.php index 282d1f3..0b23c10 100644 --- a/lib/helper/AdminEditHelper.php +++ b/lib/helper/AdminEditHelper.php @@ -278,8 +278,7 @@ public function show() $query[$this->pk()] = $_REQUEST[$this->pk()]; } elseif (isset($_REQUEST['SECTION_ID']) && $_REQUEST['SECTION_ID']) { - $model = $this->getModel(); - $this->data[$model::getSectionField()] = $_REQUEST['SECTION_ID']; + $this->data[static::getSectionField()] = $_REQUEST['SECTION_ID']; } $this->tabControl->Begin(array( diff --git a/lib/helper/AdminListHelper.php b/lib/helper/AdminListHelper.php index 41d0a59..2f9106f 100644 --- a/lib/helper/AdminListHelper.php +++ b/lib/helper/AdminListHelper.php @@ -236,8 +236,9 @@ public function __construct(array $fields, $isPopup = false) if ($sectionEditHelperClass) { $element = $className::getById($id)->Fetch(); - if ($element[$className::getSectionField()]) { - $params['ID'] = $element[$className::getSectionField()]; + $sectionField = $listHelperClass::getSectionField(); + if ($element[$sectionField]) { + $params['ID'] = $element[$sectionField]; } } @@ -325,8 +326,7 @@ protected function prepareAdminVariables() } if (static::getHelperClass(AdminSectionEditHelper::className())) { - $model = $this->getModel(); - $this->arFilter[$model::getSectionField()] = $_GET['ID']; + $this->arFilter[static::getSectionField()] = $_GET['ID']; } } @@ -406,12 +406,13 @@ protected function getContextMenu() if ($_GET['ID']) { $params = $this->additionalUrlParams; $sectionModel = $sectionEditHelper::getModel(); + $sectionField = $sectionEditHelper::getSectionField(); $section = $sectionModel::getById($_GET['ID'])->Fetch(); if ($this->isPopup()) { $params = array_merge($_GET); } - if ($section[$sectionModel::getSectionField()]) { - $params['ID'] = $section[$sectionModel::getSectionField()]; + if ($section[$sectionField]) { + $params['ID'] = $section[$sectionField]; } else { unset($params['ID']); @@ -477,6 +478,9 @@ protected function getGroupActions() */ protected function groupActions($IDs, $action) { + $sectionEditHelperClass = $this->getHelperClass(AdminSectionEditHelper::className()); + $listHelperClass = $this->getHelperClass(AdminListHelper::className()); + if (!isset($_REQUEST['model'])) { $className = static::getModel(); } @@ -484,9 +488,6 @@ protected function groupActions($IDs, $action) $className = $_REQUEST['model']; } - $sectionEditHelperClass = $this->getHelperClass(AdminSectionEditHelper::className()); - $listHelperClass = $this->getHelperClass(AdminListHelper::className()); - if ($sectionEditHelperClass && !isset($_REQUEST['model-section'])) { $sectionClassName = $sectionEditHelperClass::getModel(); } @@ -501,9 +502,11 @@ protected function groupActions($IDs, $action) unset($params['action_button']); unset($params['ID']); if ($sectionEditHelperClass) { + $sectionField = !isset($_REQUEST['model']) ? static::getSectionField() : + $sectionEditHelperClass::getSectionField(); $element = $className::getById($IDs[0])->Fetch(); - if ($element[$className::getSectionField()]) { - $params['ID'] = $element[$className::getSectionField()]; + if ($element[$sectionField]) { + $params['ID'] = $element[$sectionField]; } } @@ -527,12 +530,13 @@ protected function groupActions($IDs, $action) if ($action == 'delete-section') { if ($this->hasDeleteRights()) { $section = $sectionClassName::getById($IDs[0])->Fetch(); + $sectionField = $sectionEditHelperClass::getSectionField(); $params = $_GET; unset($params['action']); unset($params['action_button']); unset($params['ID']); - if ($section[$sectionClassName::getSectionField()]) { - $params['ID'] = $section[$sectionClassName::getSectionField()]; + if ($section[$sectionField]) { + $params['ID'] = $section[$sectionField]; } foreach ($IDs as $id) { $sectionClassName::delete($id); @@ -927,12 +931,15 @@ public function mergeSortHeaderCompare($a, $b) protected function getMixedData($sectionsVisibleColumns, $elementVisibleColumns, $sort, $raw) { $sectionEditHelperClass = $this->getHelperClass(AdminSectionEditHelper::className()); + $elementEditHelperClass = $this->getHelperClass(AdminEditHelper::className()); + + $sectionField = $sectionEditHelperClass::getSectionField(); $returnData = array(); /** * @var DataManager $sectionModel */ $sectionModel = $sectionEditHelperClass::getModel(); - $sectionFilter = array($sectionModel::getSectionField() => $_GET['ID']); + $sectionFilter = array($sectionField => $_GET['ID']); $raw['SELECT'] = array_unique($raw['SELECT']); @@ -981,7 +988,7 @@ protected function getMixedData($sectionsVisibleColumns, $elementVisibleColumns, $elementLimit = $limitData[1] - count($returnData); $elementModel = static::$model; $elementFilter = $this->arFilter; - $elementFilter[$elementModel::getSectionField()] = $_GET['ID']; + $elementFilter[$elementEditHelperClass::getSectionField()] = $_GET['ID']; // добавляем к общему количеству элементов количество элементов $this->totalRowsCount += $elementModel::getCount($elementFilter);