Для одного проекта был необходим модуль, который бы позволял расширять стандартные компоненты. В итоге модуль превратился в нечто большее, чем просто сахар для компонентов, поэтому решено было выложить под MIT лицензией.
Модуль 1. Небольшой контейнер (DIC) на основе Pimple (https://github.com/fabpot/Pimple) 2. Интерфейс для расширения модуля (SPI) 3. Обработка событий (Dispatcher) 4. Поддержка REST приложений (Router, Request, Response)
Компоненты 1. Полностью расширяемые компоненты за счет внедрения событий (onInitialize, onFilter, onWorkflow, onError, onSuccess) 2. Добавление и изменение мета-информации запросов через микро-параметры (filter, select, sort, group, limit, count), это очень просто, например
Добавление дополнительного поля для выборки 'e!SELECT' => array('DETAIL_PICTURE')
Здесь 's', 'e' означает section и element. Вы можете сами добавлять префиксы к микро-параметрам для своих данных и обрабатывать в компоненте одной строчкой.
3. Полностью структуированный и переиспользуемый код компонентов (никакой простыни кода) за счет потоков (Flow) 4. Добавлена стандартная библиотека потоков
Управление уведомлениями об ошибках или предупреждениях (Notify)
Построение мета-информации для запросов через API Битрикса (Schema)
Генерация ссылок разной вложенности и использования любых данных в ссылках через шаблоны (Scruple)
Управление мета-данными (meta, og), хлебными крошками и любой другой информацией (Meta)
Обработка файлов (Media)
Производительность По синтетическим тестам производительность в 1.5 выше, чем у стандартных. Но на то они и синтетические.
Документация К сожалению, документация в процессе написания и неизвестно когда будет. Поэтому придется изучать код модуля (src) и компонентов (папка install).
Дмитрий Зеленецкий Наследование самих компонентов нет. Потоки представляют собой модель компонента, Вы можете их наследовать, можете написать свой поток и подменить стандартный. Можете просто добавить свой новый поток при инициализации компонента и использовать его в компоненте, не меняя сам компонент и не вынося компонент в свое пространство.
Для чего это сделано? Для того, чтобы переиспользовать потоки в разных похожих компонентах. Например, в компонентах новостей и каталога, нужно проверять и получать активный раздел. Вы просто пишите один поток и используете его в двух компонентах не дублируя кода получения раздела. Можно посмотреть стандартные потоки "Publish" и "Store".
Александр Гусев Я не говорил, что модуль нужен всем. Возможно он не подойдет тем, кто вставляет компоненты через визивиг редактор и не хочет понимать как работают компоненты. Модуль подойдет тем проектам, кому нужна расширяемость компонентов и самого Битрикса. В модули реализован не только новый способ организации компонентов, но и добавлена поддержка DI контейнера и SPI.
<?php
// New component.
$APPLICATION->IncludeComponent('limque.x2:publisher', '.default', array(
'IBLOCK_ID' => IB_BRANDS,
'IBLOCK_TYPE' => IB_TYPE_CONTENT,
'SECTION_ID' => $_REQUEST['SECTION_ID'],
'SECTION_CODE' => $_REQUEST['SECTION_CODE'],
'ELEMENT_ID' => $_REQUEST['ELEMENT_ID'],
'ELEMENT_CODE' => $_REQUEST['ELEMENT_CODE'],
// Extra params.
'e!SELECT' => array('PROPERTY_PRODUCTS'),
// Links.
'LINK_INDEX' => '/news/',
'LINK_SECTION' => '/news/#SECTION_CODE#/',
'LINK_ELEMENT' => '/news/#SECTION_CODE#/#ELEMENT_ID#/',
// Sets.
'SET_TITLE' => 'N',
'SET_META' => 'Y',
// Pagination.
'PAGINATION' => 'Y',
'PAGINATION_N' => 3,
'PAGINATION_COUNT' => 9,
// Adds a logical to component.
'onWorkflow' => function($c) {
// Register my flow.
$c->register('My\\Component\\Publish\\Properties');
// Usage.
$c['publish.properties']->method();
// Rewrite standart library Notify.
$c->register('My\\Component\\Library\\Notify');
},
// Adds a filter params.
'onFilter' => function($c) {
$c->params['SET_TITLE'] = 'Y';
},
// Error callback to component.
'onError' => function($c) {
// ...
},
// Success callback to component.
'onSuccess' => function($c) {
// ...
},
// Cache.
'CACHE_TYPE' => 'A'
));
?>
<?php
// Application.
$app = \Limque\Limque::x2();
// Default action.
$app->route('/request', function ($request) use ($app) {
return new \Limque\Library\Response(array('headers' => array('Location' => '/')));
});
// Get user by id (json).
$app->get('/request/user(/@id)', function ($request, $id) use ($app) {
return $GLOBALS['USER']->GetByID((int)$id)->Fetch();
});
// Captcha.
$app->post('/request/captcha', function ($request) use ($app) {
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/classes/general/captcha.php';
$CCaptcha = new \CCaptcha();
$CCaptcha->SetCode();
return array('sid' => $CCaptcha->GetSID());
});
$app->build();
?>
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».