Бета-версия ББК
Большая часть алгоритмов компонентов повторяется. Дублирование кода усложняет поддержку и увеличивает время разработки. Два года назад вендор сделал шаг на встречу — внедрил поддержку ООП в компонентах. Но до сих пор не существует штатного компонента, от которого имело бы смысл наследоваться (компоненты меню и фильтра в расчёт не берём).
Необходимый минимум
Какие типовые задачи обычно выполняет некий абстрактный компонент?
- Подключение модулей.
- Проверка входящих параметров.
- Кеширование.
- Генерация строки постраничной навигации.
- Установка заголовков страницы.
- [Комплексный комп.] Определение запрашиваемой страницы.
Эталон
Продолжим список возможностей абстрактного эталонного компонента:
- Оперативное уведомление администратора о «схваченных исключениях».
- Работа с аяксом без лишней головной боли (в обход «битриксовой» технологии).
- Установка ОГ-тегов для соцсетей.
- Наследование параметров компонентов с возможностью модификации.
Базовые битриксовые компоненты
Всё это должно быть. В смысле, это должно быть написано один раз и применяться на всём проекте. Не копи-пастом, а в виде дочерних классов.
Встречайте «Базовые битриксовые компоненты» — первые, по-настоящему функциональные компоненты для «Битрикса».
Разработчику больше не нужно тратить время на типовые задачи. Задать компоненту собственную логику, сохранив все выше перечисленные эталонные возможности достаточно просто.
Сборка включает в себя два основополагающих абстрактных компонента: basis.router (для комплексных компонентов) и basis (для всех остальных), и компоненты elements.* для работы с элементами инфоблока. У компонентов есть три точки входа, через методы:
- executeProlog() — выполняется в начале работы компонента, после подключения модулей, установки параметров и заголовков. Результаты метода не кешируются.
- executeMain() — основная логика компонента, все ключевые операции производятся в этом методе. Если в параметрах компонента передан ключ CACHE_TYPE не равный «N», результаты метода буду закешированы.
- 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. В «Битриксе» много корпоративщины, коммерции. Я не говорю, что это плохо или хорошо, просто пришло время разбавить её. Я приглашаю всех желающих принять участие в развитии ББК, пишите мне на почту или в комментарии.
Добрый день!
Я только вот вот поставил Ваше творение, она меня заинтересовала, как раз в ББК «ВРОДЕ» есть то что мне нужно, но блин я её не могу запустить, помогите!!!
Хочу чтобы вылавливать входящие 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();
}
}
Заготовка выглядит правильно. Уточните, где именно возникла проблема, и тогда, возможно, смогу помочь.