Подсказки для экзамена 2 bitrix (Основные инструменты кастомизации)

Cheatsheet пишется как набор сниппетов и шпаргалок, тут могут быть неполные фрагменты кода чтоб не раздувать размер документа.

Идея такова, что готовишься ты по другим материалам (у битрикса есть хороший курс для подготовки во второму экзамену), а cheatsheet нужен на случай если забыл метод\импорт и нужно быстро подсмотреть.

Доработка компонента

Основные файлы компонента

result_modifier.php

  • Описание: Выполняет дополнительные запросы к базе данных. Результаты запросов кешируются.

  • Добавить связь в ORM + импорты(use):

    use Bitrix\Iblock\Elements\Element{API_CODE}Table;
    use Bitrix\Main\ORM\Fields\Relations\Reference;
    use Bitrix\Main\ORM\Query\Join;
    use Bitrix\Main\UserTable;
    
    ->registerRuntimeField(new Reference(
       'REF_USER',
       UserTable::class,
       Join::on('this.USER.VALUE', 'ref.ID')
    ));
    
    
  • Кеширование результата:

    $this->__component->SetResultCacheKeys(array('MY_TITLE', 'IS_OBJECT'));

component_epilog.php

  • Описание: Вызывается на каждом хите (не кешируется).

  • Пример установки свойств страницы:

    $APPLICATION->SetPageProperty('prop_code', $value); // Устанавливать в component_epilog.php
    $this->__component->SetResultCacheKeys(array('MY_TITLE', 'IS_OBJECT')); // В result_modifier.php

Вывод информации в шаблоне сайта

template.php

  • Добавление контента в область вывода:

    <?$this->SetViewTarget("sidebar");?>
        <!-- HTML-данные -->
    <?$this->EndViewTarget();?>

header.php

  • Вывод содержимого области:

    <?$APPLICATION->ShowViewContent("sidebar")?>

Получение и изменение свойств страницы

  • Получение директории запрошенной страницы:

    $rDir = $request->getRequestedPageDirectory(); // Например: "/catalog/category"
  • Вывод/изменение свойства страницы:

    $APPLICATION->ShowProperty('prop_code');
    $APPLICATION->SetPageProperty('prop_code', $value);

Модификация сформированной страницы

  • Обработчик события OnEndBufferContent:

    AddEventHandler('main', 'OnEndBufferContent', ['Class', 'Method']);
    
    public static function OnEndBufferContent(&$content)
    {
        $content = str_replace('#DATE#', date('d.m.Y'), $content);
    }

Добавление пункта в меню админки

  • Обработчик события OnAdminContextMenuShow:

    AddEventHandler('main', 'OnAdminContextMenuShow', [
        EventHandlers::class,
        'onAdminContextMenuShow'
    ]);
    
    class EventHandlers
    {
        public static function onAdminContextMenuShow(&$items)
        {
            $items[] = [
                'TEXT' => 'Задать вопрос',
                'LINK' => $uri->getUri(),
                'TITLE' => 'Отправить ссылку на текущую страницу администратору',
            ];
        }
    }

Локализация

  • Использование локализации:

    use \Bitrix\Main\Localization\Loc;
    
    Loc::loadMessages(__FILE__);
    echo Loc::getMessage('SMALL_LENGTH');

События перед отправкой почты

  • Обработчик события OnBeforeEventAdd:

    AddEventHandler('main', 'OnBeforeEventAdd', Array("MyForm", "OnBeforeEventAddHandler"));
    
    class MyForm
    {
      	public static function OnBeforeEventAddHandler(&$event, &$lid, &$arFields)
      	{
      		$arFields["NEW_FIELD"] = "Новый макрос для почтового шаблона";
      	}
    }

События индексации

  • Обработчик события BeforeIndex

    <?php
    
    use Bitrix\Main\Loader;
    use Bitrix\Main\EventManager;
    
    
    // Подключаем модули
    Loader::includeModule('iblock');
    Loader::includeModule('search');
    
    
    // Регистрируем обработчик события для модуля поиска
    $eventManager = EventManager::getInstance();
    $eventManager->addEventHandler(
        'search',
        'beforeIndex',
        'addAuthorClassToReviewTitle'
    );
    
    
    /**
    
     * Обработчик события beforeIndex
     * Добавляет класс автора рецензии к заголовку при индексации
     * 
     * @param array $arFields - поля индексации
     * @return array
     */
    function addAuthorClassToReviewTitle(array $arFields)
    {
        // Проверяем, что это рецензия (адаптируйте под ваш инфоблок)
        if ($arFields['MODULE_ID'] == 'iblock' && $arFields['PARAM2'] == 'ИД_вашего_инфоблока_рецензий') {
            // Получаем элемент инфоблока
            $res = CIBlockElement::GetByID($arFields['ITEM_ID']);
            if ($element = $res->Fetch()) {
                // Получаем значение свойства "Класс автора" (адаптируйте под ваше свойство)
                $property = CIBlockElement::GetProperty(
                    $element['IBLOCK_ID'],
                    $element['ID'],
                    [],
                    ['CODE' => 'AUTHOR_CLASS'] // Код свойства класса автора
                );
    
                if ($prop = $property->Fetch()) {
                    $authorClass = $prop['VALUE'];
                    if ($authorClass) {
                        // Добавляем класс автора к заголовку
                        $arFields['TITLE'] .= ' [' . $authorClass . ']';
                    }
                }
            }
        }
    
        return $arFields;
    }



Событие для изменения глобального меню админки

  • Обработчик события OnBuildGlobalMenu

    <?php
    
    use Bitrix\Main\Loader;
    use Bitrix\Main\EventManager;
    
    
    // Подключаем модули
    Loader::includeModule('main');
    
    
    // Регистрируем обработчик события для главного модуля
    $eventManager = EventManager::getInstance();
    $eventManager->addEventHandler(
        'main',
        'OnBuildGlobalMenu',
        'addGlobalMenuItem'
    );
    
    
    /**
    
     * Обработчик события OnBuildGlobalMenu
     * 
     * @param array $aGlobalMenu - массив пунктов глобального меню админки (Контент, Настройки)
     * @param array $aModuleMenu - массив пунктов подменю глобального меню (Избранное, Пользователи)
     * @return array
     */
    fpublic static function addGlobalMenuItem(&$aGlobalMenu, &$aModuleMenu)
    {
    	$aMenu = [
            'menu_id' => 'newItem',
            'text' => 'Новый пункт',
        ];
        $aGlobalMenu['global_menu_new'] = $aMenu;
    
        $aMenuItem = [
            'parent_menu' => 'global_menu_new',
            'text' => 'Новый подпункт',
            'url' => 'link1'
        ];
        $aModuleMenu[] = $aMenuItem;
    }

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *