В прошлых постах мы говорили про различные системы и инструменты, которые помогают решать задачи разработчика.
А сегодня поговорим о том, как в Bitrix можно организовать компонент не просто для отображения, а как полноценный контроллер с CRUD-операциями.
Обработчик запросов в классе компонента (файл class.php) позволяет:
✅ Инкапсулировать весь код в одном классе
✅ Повторно использовать методы, данные и параметры компонента
✅ Использовать языковые фразы, шаблоны компонента
✅ Переопределять в компонентах-потомках стандартное поведение
Чтобы класс компонента мог обрабатывать запросы, необходимо:
▶️ Реализовать интерфейс \Bitrix\Main\Engine\Contract\Controllerable
▶️ Определить методы-действия с суффиксом Action
▶️ Реализовать метод configureActions (обычно возвращает пустой массив — конфигурацию по умолчанию)
▶️ Если нужно добавлять, обрабатывать ошибки, то стоит реализовать \Bitrix\Main\Errorable
При выполнении компонента в аяксовом режиме выполняются последовательно:
1️⃣CBitrixComponent::onIncludeComponentLang
2️⃣ CBitrixComponent::onPrepareComponentParams
Запуск действия с фильтрами:
<?php
namespace local\components\vendor\example;
use CBitrixComponent;
use Bitrix\Main\Error;
use Bitrix\Main\Engine\Contract\Controllerable;
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
class ExampleComponent extends CBitrixComponent implements Controllerable
{
public function executeComponent()
{
// этот код не будет выполняться при запуске ajax-действий
}
public function configureActions()
{
return [];
}
public function onPrepareComponentParams($arParams)
{
// подготовка параметров
}
public function createAction(array $fields): ?array
{
$example = Example::add($fields);
if (!$example) {
$this->addError(new Error('Could not create example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function viewAction(int $id): ?array
{
$example = Example::getById($id);
if (!$example) {
$this->addError(new Error('Could not find example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function listAction(array $fields): ?array
{
$examples = Example::getList($fields);
return array_map(static fn ($example) => $example->toArray(), $examples);
}
public function updateAction(int $id, array $fields): ?array
{
$example = Example::update($id, $fields);
if (!$example) {
$this->addError(new Error('Could not update example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function deleteAction(int $id): ?array
{
$example = Example::delete($id);
if (!$example) {
$this->addError(new Error('Could not delete example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
}