Skip to content

Instantly share code, notes, and snippets.

@xamedow
Last active March 2, 2016 06:08
Show Gist options
  • Save xamedow/fad042ae9b18bfaaac62 to your computer and use it in GitHub Desktop.
Save xamedow/fad042ae9b18bfaaac62 to your computer and use it in GitHub Desktop.
Bitrix event handler for upsert operations template
<?
// файл /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