Last active
March 2, 2016 06:08
-
-
Save xamedow/fad042ae9b18bfaaac62 to your computer and use it in GitHub Desktop.
Bitrix event handler for upsert operations template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
// файл /local/php_interface/init.php | |
// регистрируем обработчик | |
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("CIBlockHandler", "OnBeforeIBlockElementUpdateHandler")); | |
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("CIBlockHandler", "OnAfterIBlockElementAddHandler")); | |
/** | |
* Класс обработчик событий добавления/изменения элементов инфоблока «Учреждения (только подведомственные министерству!!!)». | |
* Разрешает запись выбранных полей только адимнистратору. | |
* Class CIBlockHandler | |
*/ | |
class CIBlockHandler { | |
/** | |
* Id инфоблока фирмы | |
*/ | |
const IBLOCK_ID = 50; | |
/** | |
* Шаблон строки с сообщение об ошибки, выводимой пользователю. | |
*/ | |
const ALERTMESSAGE = 'Изменение %s запрещено. Свяжитесь с администратором сайта'; | |
/** | |
* @var array символьные коды свойств, подлежащих обработке | |
*/ | |
private static $arrcodenames = array( | |
'URL', | |
'SHORT_URL' | |
); | |
/** | |
* @var array символьные коды свойств, НЕ подлежащих обработке | |
*/ | |
private static $arrskippedcodenames = array(); | |
/** | |
* @var array символьные коды свойств, НЕ подлежащих обработке | |
*/ | |
private static $failedProperties = array(); | |
/** | |
* @var int id элемента | |
*/ | |
private static $elementId; | |
/** | |
* @var array значения свойств элемента | |
*/ | |
private static $elementProperties = array(); | |
/** | |
* @var array данные свойств | |
*/ | |
private static $arrFields = array(); | |
/** | |
* Получает массив значений свойств элемета. | |
*/ | |
private static function setElementId() | |
{ | |
self::$elementId = self::$arrFields['ID'] ? self::$arrFields['ID'] : 'n0'; | |
} | |
/** | |
* Сеттер массива фейловых свойств. | |
* | |
* @param $property | |
*/ | |
private static function setFailedProperties($property) | |
{ | |
array_push(self::$failedProperties, $property); | |
} | |
/** | |
* Получение набора свойств редактируемого элемента. | |
*/ | |
private static function setElementProperties() | |
{ | |
self::setElementId(); | |
$properties = CIBlockElement::GetProperty( | |
self::$arrFields['IBLOCK_ID'], | |
self::$elementId, | |
array("sort" => "asc") | |
); | |
while (self::$elementProperties[] = $properties->Fetch()) { | |
} | |
} | |
/** | |
* Валидирует свойства, указанные массиве ARRCODENAMES на указанное условие. | |
* | |
* @param $elementProperty | |
* @param $propertyValueId | |
* @param bool $update | |
*/ | |
private static function validateField($elementProperty, $propertyValueId, $update = false) | |
{ | |
global $USER; | |
if (!$USER->IsAdmin()) { | |
// Если обновляем запись и запись поля не разрешена - лезем в базу за старым значением свойства, иначе | |
// забиваем пустое значение. | |
self::$arrFields['PROPERTY_VALUES'][ $elementProperty['ID'] ][ $propertyValueId ]['VALUE'] = | |
($update) ? $elementProperty['VALUE'] : ''; | |
// Указываем название сфейленного свойства. | |
self::setFailedProperties($elementProperty['NAME']); | |
} | |
} | |
/** | |
* Проходим по значениям эемента и вешаем обработчики, только на те свойства, которые указаны в разрешаю | |
* | |
* @param bool $update - - флаг обновляем(true) или добавляем(false) элемент. | |
*/ | |
private static function iterateFields($update = true) | |
{ | |
if (count(self::$elementProperties)) { | |
foreach (self::$elementProperties as $elementProperty) { | |
if (in_array($elementProperty['CODE'], self::$arrcodenames)) { | |
// Id значения свойства, если свойство было пустым, id будет n0. | |
$propertyValueId = $update && $elementProperty['PROPERTY_VALUE_ID'] | |
? $elementProperty['PROPERTY_VALUE_ID'] : 'n0'; | |
self::validateField($elementProperty, $propertyValueId, $update); | |
} | |
} | |
} | |
} | |
/** | |
* Генерация пользовательских сообщений об ошибках. | |
*/ | |
private static function alertUser() | |
{ | |
if (!empty(self::$failedProperties)) { | |
// global $APPLICATION; | |
// $properties = implode(', ', self::$failedProperties); | |
// require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); | |
// CAdminMessage::ShowOldStyleError('not here!'); | |
// new CAdminMessage(sprintf(self::ALERTMESSAGE, $properties)); | |
} | |
} | |
/** | |
* Общий обработчик событий | |
* | |
* @param $arFields - массив измененных пользователем полей | |
* @param $update - флаг обновляем(true) или добавляем(false) элемент | |
*/ | |
private function handlerDecorator(&$arFields, $update) | |
{ | |
if ($arFields['IBLOCK_ID'] === self::IBLOCK_ID) { | |
self::$arrFields = $arFields; | |
self::setElementProperties(); | |
self::iterateFields($update); | |
// self::alertUser(); | |
$arFields = self::$arrFields; | |
} | |
} | |
// обработчик события изменения элемента | |
function OnBeforeIBlockElementUpdateHandler(&$arFields) | |
{ | |
self::handlerDecorator($arFields, true); | |
} | |
// обработчик события добавления элемента | |
function OnAfterIBlockElementAddHandler(&$arFields) | |
{ | |
self::handlerDecorator($arFields, false); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment