Добро пожаловать в блог, где важны слова.
Тут я частенько публикую в открытым доступе полезные материаллы и готовые решения для повседневных задач по 1С-Битрикс и Битрикс24, а также затрагиваю темы всё что связано с сайтостроением
События в 1С-Битрикс
06.05.2022
1434

Не забудьте первым делом зарегистрировать класс в системе битрикса, через composer или Bitrix\Main\Loader::registerAutoloadClasses()
namespace App;
use Bitrix\Main\Diag\Debug;
use Bitrix\Main\Entity\EventResult;
use Bitrix\Main\Entity\FieldError;
use Bitrix\Main\EventManager;
use Bitrix\Main\Entity\Event;
use CGroup;
use CIBlock;
use CIBlockElement;
use CIBlockProperty;
use CSite;
use CUser;
class EventHandlers
{
public static $iblockTypeCode = 'forms';
public static $iblockIDProducts = 2;
public static $iblockIDArticle = 9;
public static function init()
{
$eventManager = EventManager::getInstance();
// Событие "до" регистрации пользователя
$eventManager->addEventHandler(
'main',
'OnBeforeUserRegister',
[self::class, 'checkEmail']
);
// Событие "после" регистрации пользователя
$eventManager->addEventHandler(
'main',
'OnAfterUserRegister',
[self::class, 'addUserGroup']
);
// Событие "перед" добавлением инфоблока
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockAdd',
[self::class, 'checkIssetCode']
);
// Событие "перед" изменением инфоблока
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockUpdate',
[self::class, 'checkIssetCode']
);
// Событие "после" добавления инфоблока
$eventManager->addEventHandler(
'iblock',
'OnAfterIBlockAdd',
[self::class, 'defaultSettingsIB']
);
// Событие "перед" добавлением элемента в инфоблок
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockElementAdd',
[self::class, 'checkArticleProduct']
);
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockElementUpdate',
[self::class, 'checkArticleProduct']
);
// Событие "после" добавления элемента в инфоблок
$eventManager->addEventHandler(
'iblock',
'OnAfterIBlockElementAdd',
[self::class, 'SendEmailNewArticle']
);
// Событие "до" добавления записи в сущность
$eventManager->addEventHandler(
'',
'ClientsOnBeforeAdd',
[self::class, 'requireFieldCompany']
);
// Событие "после" добавления записи в сущность
$eventManager->addEventHandler(
'',
'ClientsOnAfterAdd',
[self::class, 'getFieldsClients']
);
// Создание собственного тип свойства в инфоблоках
$eventManager->addEventHandler(
'iblock',
'OnIBlockPropertyBuildList',
[self::class, 'newTypeProp']
);
}
/**
* @param array $arFields
* @return bool
* Разрешаем регистрировать пользователей с почтой от gmail или yandex
*/
public static function checkEmail(array &$arFields): bool
{
global $APPLICATION;
$gmail = stristr($arFields['EMAIL'], '@gmail.com');
$yandex = stristr($arFields['EMAIL'], '@yandex.ru');
if($gmail != false || $yandex != false){
return true;
}else{
$APPLICATION->ThrowException('Допускаются почты только от @yandex.ru или @gmail.com');
return false;
}
}
/**
* @param array $arFields
* @return bool
* Добавление пользователя в группу
*/
public static function addUserGroup(array &$arFields): bool
{
// Получим все lid сайтов
$lidSites = self::getListSites('LID');
$arrGroups = self::getUserGroups();
if(in_array($arFields['SITE_ID'], $lidSites))
{
foreach($arrGroups as $item){
if($item['STRING_ID'] == $arFields['SITE_ID']){
CUser::SetUserGroup($arFields['USER_ID'], array($item['ID']));
}
}
}
return true;
}
/**
* @param $code
* @return array
* Получаем список сайтов зарегистрированных в системе
*/
public static function getListSites($code = false): array
{
$arrSites = [];
$by = 'sort';
$order = 'desc';
$rsSites = CSite::GetList($by, $order, array());
while($arSite = $rsSites->Fetch())
{
if($code){
$arrSites[] = $arSite[$code];
}else{
$arrSites[] = $arSite;
}
}
return $arrSites;
}
/**
* @param $code
* @return array
* Получаем все группы пользователей
*/
public static function getUserGroups($code = false): array
{
$arrGroups = [];
$by = 'sort';
$order = 'desc';
$rsGroups = CGroup::GetList($by, $order, array());
while($arGroup = $rsGroups->Fetch())
{
if($code){
$arrGroups[] = $arGroup[$code];
}else{
$arrGroups[] = $arGroup;
}
}
return $arrGroups;
}
/**
* @param array $arFields
* @return bool
* Делаем поле code (символьный код) обязательным
*/
public static function checkIssetCode(array &$arFields): bool
{
global $APPLICATION;
if(empty($arFields['CODE'])){
$APPLICATION->ThrowException('Введите символьный код!');
return false;
}else{
return true;
}
}
/**
* @param array $arFields
* @return bool
* Добавляем некоторые настройки после создания ИБ, только у конкретного типа ИБ
*/
public static function defaultSettingsIB(array &$arFields): bool
{
if($arFields['IBLOCK_TYPE_ID'] == self::$iblockTypeCode)
{
$arProps = array(
array(
"NAME" => "ФИО",
"ACTIVE" => "Y",
"SORT" => "100",
"CODE" => "FIO",
"PROPERTY_TYPE" => "S",
"IBLOCK_ID" => $arFields["ID"]
),
array(
"NAME" => "Телефон",
"ACTIVE" => "Y",
"SORT" => "101",
"CODE" => "PHONE",
"PROPERTY_TYPE" => "S",
"IBLOCK_ID" => $arFields["ID"]
),
array(
"NAME" => "Email",
"ACTIVE" => "Y",
"SORT" => "102",
"CODE" => "EMAIL",
"PROPERTY_TYPE" => "S",
"IBLOCK_ID" => $arFields["ID"]
),
);
// Создадим свойства
$IBProperty = new CIBlockProperty;
foreach($arProps as $prop)
{
$IBProperty->Add($prop);
}
// Выставим поля по умолчанию
$fields = [];
$fields['ACTIVE_FROM']['DEFAULT_VALUE'] = '=now';
CIBlock::setFields($arFields['ID'], $fields);
}
return true;
}
/**
* @param array $arFields
* @return bool
* Проверяем Артикул на уникальность
*/
public static function checkArticleProduct(array &$arFields): bool
{
$run = true;
if($arFields['IBLOCK_ID'] == self::$iblockIDProducts)
{
foreach($arFields['PROPERTY_VALUES']['9'] as $item)
{
$article = $item['VALUE'];
}
if(isset($article) && !empty($article))
{
$arrProducts = self::getElements(false, array(
'IBLOCK_ID' => self::$iblockIDProducts,
'!ID' => $arFields['ID'],
'PROPERTY_ARTNUMBER' => $article
), array('ID'));
if(!empty($arrProducts) && !empty($arrProducts[0]['ID'])){
global $APPLICATION;
$APPLICATION->ThrowException('Артикул: ' . $article . ' уже существует у товара с ID: ' . $arrProducts[0]['ID'] . ' укажите другой!');
$run = false;
}
}
}
return $run;
}
/**
* @param $order
* @param $filter
* @param $select
* @return array
* Получаем список элементов
*/
public static function getElements($order, $filter, $select): array
{
if(!$order)
{
$order = array("ID" => "ASC");
}
if(!$select)
{
$select = array('*');
}
if($filter['IBLOCK_ID'])
{
$dbElem = CIBlockElement::GetList($order, $filter, false, false, $select);
$result = [];
while($elem = $dbElem->Fetch()){
$result[] = $elem;
}
return $result;
}else{
return [];
}
}
/**
* @param array $arFields
* @return bool
* Уведомляем о новой статье через email
*/
public static function SendEmailNewArticle(array &$arFields): bool
{
if($arFields['IBLOCK_ID'] == self::$iblockIDArticle)
{
// Debug::dumpToFile($arFields, 'message', 'LogArticle');
}
return true;
}
/**
* @param Event $event
* @return EventResult
* Поле компания обязательна к заполнению, когда выбран тип клиента "Корпоративный"
*/
public static function requireFieldCompany(Event $event)
{
$entity = $event->getEntity(); // получаем объект сущности
$arFields = $event->getParameter('fields');
// Модификация данных
$result = new EventResult();
$arFields['UF_DATE_CREATE'] = date('d.m.Y H:i:s');
$result->modifyFields($arFields);
if($arFields['UF_TYPE_CLIENT'] == 7 && empty($arFields['UF_COMPANY']))
{
$arErrors = [];
$arErrors[] = new FieldError($entity->getField("UF_COMPANY"), "Ошибка в поле 'Компания'. Поле не должно быть пустым, когда выбран корпоративный клиент");
$result->setErrors($arErrors);
}
return $result;
}
public static function getFieldsClients(Event $event)
{
$arFields = $event->getParameter('fields');
// Debug::dumpToFile($arFields, 'fields', 'LogClients');
return true;
}
public static function newTypeProp(): array
{
return array(
"PROPERTY_TYPE" => "S",
"USER_TYPE" => "HTML",
"DESCRIPTION" => "Новое кастомное поле",
"GetPropertyFieldHtml" => array(self::class, "GetPropertyFieldHtml")
);
}
public static function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
{
return 'Кастомное поле
';
}
}