2 заметки с тегом

ББК

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

Сайт проекта: http://bbc.samokhvalov.info

Релиз первой версии ББК

cover

Несколько дней назад в мастер-ветку ББК была вмержена версия 1.0.0. По правде сказать, даже я, его создатель, не ожидал этого релиза. Работы по улучшению компонентов начались сразу же после релиза бета-версии 0.0.1 и продолжаются по сей день. Но в какой-то момент я понял, что есть ещё много идей, которые необходимо реализовать в ББК, но в то же время, был уже существенный пласт наработок, которые применяются в нескольких секретных проектах.

Нововведения

К важным отличиям первой стабильной версии можно отнести перенос бизнес-логики в модуле и запуск сайта с полноценной документацией.

В документации описаны главные особенности проекта и приведены примеры решения ряда типовых и не очень задач. Раздел «Возможности» ознакомит впервые пришедших с ключевыми фичами ББК. «Архитектура» расскажет о структуре сборки и том, как её «готовить». «Примеры» наглядно покажут, как красиво, используя ББК, можно решать задачи по разработке компонентов.

Документация поможет понять идеологию, мощь и красоту ББК. Напоминаю, что вы не найдёте в ней полного списка методов классов и, уж тем более, их описания. Для этого воспользуйтесь своей любимой средой разработки: все классы и методы проекта задокументированы (описания, параметры, возвращаемые результаты, исключения и т. д.), а их названия соответствуют сущностям, с которыми они взаимодействуют.

Документация хранится на «Гитхабе» в виде маркдаун-файлов. Если вы найдёте неточность или сможете дополнить её, пожалуйста, форкнитесь и сделайте пул-реквест.

Битрикс-эксперты

Относительно недавно мы с Игорем Цупко запустили бета-версию проекта «Битрикс-эксперты», о котором я расскажу вам позже. ББК стал частью этого проекта, что повлекло за собой два изменения: появилась приставка Bex\ в неймспейсах и сайт размещается на платформе «Бекса».

Продолжение следует…

Тем временем, продолжается работа над ББК 2.0. Забегая вперёд скажу, что уже многое сделано и все интересующие могут найти рабочие исходники в соседних ветках на «Гитхабе». Основной особенностью второй версии станет уход от трейтов, на смену котороым придут плагины — классы, подключаемые и выполняемые параллельно с компонентом, но изолированно от него.

ББК — открытый, не имеющий аналогов в битрикс-сообществе проект. Я приглашаю всех желающих принять участие в его развитии. Если вы хотите получить ценный опыт, если вам надоела техническая несостоятельность «Битрикса» — пишите мне на почту: nik@samokhvalov.info. Вместе мы выведем битрикс-разработку на новый уровень качества.

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

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

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

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

  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. В «Битриксе» много корпоративщины, коммерции. Я не говорю, что это плохо или хорошо, просто пришло время разбавить её. Я приглашаю всех желающих принять участие в развитии ББК, пишите мне на почту или в комментарии.