Добро пожаловать в блог, где важны слова.

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

События в 1С-Битрикс

События в 1С-Битрикс

Не забудьте первым делом зарегистрировать класс в системе битрикса, через 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 '

Кастомное поле

'; } }
Возврат к списку