Бета-версия ББК

Большая часть алгоритмов компонентов повторяется. Дублирование кода усложняет поддержку и увеличивает время разработки. Два года назад вендор сделал шаг на встречу — внедрил поддержку ООП в компонентах. Но до сих пор не существует штатного компонента, от которого имело бы смысл наследоваться (компоненты меню и фильтра в расчёт не берём).

Необходимый минимум

Какие типовые задачи обычно выполняет некий абстрактный компонент?

  1. Подключение модулей.
  2. Проверка входящих параметров.
  3. Кеширование.
  4. Генерация строки постраничной навигации.
  5. Установка заголовков страницы.
  6. [Комплексный комп.] Определение запрашиваемой страницы.

Эталон

Продолжим список возможностей абстрактного эталонного компонента:

  1. Оперативное уведомление администратора о  «схваченных исключениях».
  2. Работа с аяксом без лишней головной боли (в обход «битриксовой» технологии).
  3. Установка ОГ-тегов для соцсетей.
  4. Наследование параметров компонентов с возможностью модификации.

Базовые битриксовые компоненты

Всё это должно быть. В смысле, это должно быть написано один раз и применяться на всём проекте. Не копи-пастом, а в виде дочерних классов.

Встречайте «Базовые битриксовые компоненты» — первые, по-настоящему функциональные компоненты для «Битрикса».

Разработчику больше не нужно тратить время на типовые задачи. Задать компоненту собственную логику, сохранив все выше перечисленные эталонные возможности достаточно просто.

Сборка включает в себя два основополагающих абстрактных компонента: basis.router (для комплексных компонентов) и basis (для всех остальных), и компоненты elements.* для работы с элементами инфоблока. У компонентов есть три точки входа, через методы:

  1. executeProlog() — выполняется в начале работы компонента, после подключения модулей, установки параметров и заголовков. Результаты метода не кешируются.
  2. executeMain() — основная логика компонента, все ключевые операции производятся в этом методе. Если в параметрах компонента передан ключ CACHE_TYPE не равный «N», результаты метода буду закешированы.
  3. executeEpilog() — выполняется после подключения шаблона компонента. Результаты не кешируются.

Маленький пример структуры класса, отнаследованного от базового компонента:

<?php

namespace Components\Project;

use Components\Basis;


if(!defined('B_PROLOG_INCLUDED')||B_PROLOG_INCLUDED!==true)die();

\CBitrixComponent::includeComponentClass('basis:basis');


class Test extends Basis\Basis
{
    // Типаж для работы с элементами инфоблоков и различные соцфичи
    use Elements;

    // Модули, которые будут подключены
    protected $needModules = array('iblock');

    // Указываем условия для проверок и приведения параметров
    protected $checkParams = array(
        'IBLOCK_TYPE' => array('type' => 'string'),
        'IBLOCK_ID' => array('type' => 'int')
    );

    public function onPrepareComponentParams($params)
    {
        // Устанавливаем свои параметры, если необходимо

        return $params;
    }

    protected function executeProlog()
    {
        // Выполняем действия в самом начале работы компонента. 
        // Например, можно сохранить какие-нибудь данные, отправленные
        // из формы
    }

    protected function executeMain()
    {
        // Основная логика, метод кешируется. Например, делаем выборку
        // из инфоблока
    }

    protected function executeEpilog()
    {
        // Операции, производимые после подключения шаблона компонента
    }
}

Кроме того, компонент elements.list вызывает на каждой итерации цикла обработки результатов запроса элементов инфоблока метод prepareElementsResult(). С помощью этого метода в дочерних компонентах можно модифицировать обработку результатов выборки: удалять, изменять и добавлять поля, производить какие-либо операции. Метод должен вернуть либо массив полей элемента, либо false для пропуска итерации.

public function prepareElementsResult($element)
{
    if ($element['NAME'] === 'BBC')
    {
        // Пропускаем итерацию, результат не попадёт в arResult
        return false;
    }

    // Обрезаем описание для анонса
    $element['PREVIEW_TEXT'] = substr($element['PREVIEW_TEXT'], 0, 100);

    return $element;
}

Все методы классов задокументированы, компоненты серии elements.* — хороший пример, демонстрирующий возможности сборки, так что смело открывайте свои «идэешки» и наслаждайтесь красотой и умениями ББК. Полноценной документации в онлайне нет, пока только краткое техописание.

Пишите, предлагайте, критикуйте и отправляйте пул-реквесты. Вэлкам!

Базовые битриксовые компонентыβ

P. S. В «Битриксе» много корпоративщины, коммерции. Я не говорю, что это плохо или хорошо, просто пришло время разбавить её. Я приглашаю всех желающих принять участие в развитии ББК, пишите мне на почту или в комментарии.

Поделиться
Отправить
Запинить
1 комментарий
Артур

Добрый день!
Я только вот вот поставил Ваше творение, она меня заинтересовала, как раз в ББК «ВРОДЕ» есть то что мне нужно, но блин я её не могу запустить, помогите!!!
Хочу чтобы вылавливать входящие POST запросы, в классе и перенаправлять их обработчику постов

покажите на примере кода вот этого

<?if(!defined(«B_PROLOG_INCLUDED») || B_PROLOG_INCLUDED!==true)die();

class adm_panel extends Basis
{
protected $controller;
protected $request;

public function __construct($component = null)
{
parent::__construct($component);
$this->request = \Bitrix\Main\Context::getCurrent()->getRequest();
}
public function executeComponent()
{

$this->includeComponentTemplate();

}
}

Никита Самохвалов

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

Популярное