Бандлы - techart/bitrix.tao GitHub Wiki
Что из себя представляет бандл в Bitrix.TAO? Это некая файловая структура, по своей функциональности схожая с компонентом в ТАО, позволяющая достаточно легко переносить ее из системы в систему.
Для одного проекта достаточно будет создать один бандл с именем проекта.
Структура
Все бандлы должны храниться в папке local/bundles/.
- /NameBundle/
- /lib/
- Bundle.php
- /Controller/
- SomeAction.php
- /Infoblock/
- YourInfoblock.php
- /Form/
- YourForm.php
- /scripts/
- /styles/
- /views/
- /YourInfoblock/
- list.phtml
- teaser.phtml
- full.phtml
- list.phtml
- item.phtml
- /YourInfoblock/
- /pages/
- page.phtml
- /lib/
Создание бандла
В общем случае для создания бандла достаточно следующих шагов:
- Заводим папку с именем бандла. В нее добавляем файл Bundle.php, в котором описываем одноименный класс, наследуемый от библиотечного \TAO\Bundle.
// local/bundles/MyBundle/lib/Bundle.php
namespace App\Bundle\MyBundle;
class Bundle extends \TAO\Bundle
{
//какой-то код
}
- Подключаем бандл в системе, в файле init.php.
\TAO::addBundle('MyBundle');
Далее на основе бандла можно создавать инфоблоки любым удобным образом (на основе стандартных средств битрикса или ТАО.Bitrix).
Кроме того, в Bundle.php производится регистрация инфоблоков, описание правил маршрутизации урлов, или другой функционал.
Инициализация инфоблоков
Для регистрации инфоблоков применяется метод init() класса Bundle, куда необходимо передать схему инфоблока.
//local/bundles/News/lib/Bundle.php
namespace App\Bundle\News;
class Bundle extends \TAO\Bundle
{
public function init()
{
$this->infoblockSchema('news', 'news', 'News');
}
...
}
Отложенная инициализация
Для этого применяется метод cachedInit(). Инициализация загрузки функционала будет производиться не каждый раз, а только при изменении файла класса.
Например, инициализация типов инфоблоков.
// local/bundles/MyBundle/lib/Bundle.php
namespace App\Bundle\MyBundle;
class Bundle extends \TAO\Bundle
{
public function cachedInit()
{
$this->infoblockType('mybundle', 'Мой бандл');
}
}
Организация маршрутизации
Для описании массива правил маршрутизации необходимо воспользоваться методом routes().
namespace App\Bundle\News;
class Bundle extends \TAO\Bundle
{
public function routes()
{
return array(
'{^/news/$}' => array('action' => 'viewList'),
'{^/news/(\d+)/$}' => array('action' => 'viewItem', '{1}'),
);
}
}
При описании массива правил применяются следующие ключи:
- action - указываем имя экшена, который будет применяться по данному адресу.
- controller - контроллер.
- code - символьный код инфоблока.
- id_or_code - ID или символьный код инфоблока.
- elements_of - выборка элементов из инфоблока. Имя инфоблока является значением ключа.
- element_of - выбрать один элемент инфоблока. Имя инфоблока является значением ключа.
- sections_of - выборка всех секций с элементами инфоблока.
- section_of - выбрать одну секцию со свеми элементами.
Controller
Для реализации какой-то особой функциональности доступна система контроллеров.
Например, описываем экшены для списка записей и для одной записи новостей.
namespace App\Bundle\News\Controller;
class Index extends \TAO\Controller
{
public function viewList()
{
return $this->render('index');
}
public function viewItem($id)
{
$item = \TAO::getInfoblock('corporate_news_s1')->loadItem($id); //подключаем инфоблок corporate_news_s1, в котором выбираем одну запись по id (метод loadItem)
if (!$item) {
return $this->pageNotFound();
}
return $this->render('item', array('item' => $item));
}
}
Использование CLI-обработчиков в бандле
Если использование утилит командной строки относится непосредственно к бандлу, то допускается создавать и хранить файлы с их реализацией в самом бандле.
Для этого необходимо переопределить метод public function cli($options)
(\TAO\Bundle) в классе Bundle.php
.
// local/bundles/NameBundle/lib/Bundle.php
class Bundle extends \TAO\Bundle
{
...
public function cli($action, $options)
{
if ($action == 'name_of_action') {
// какие-то действия
}
}
}
Если предполагается, что команд много, или их реализация занимает много места, то описание каждой утилиты можно вынести в отдельный файл, а в методе оставить только вызовы. Тогда файлы следует хранить в папке local/bundles/NameBundle/lib/CLI/action.php.
Методы класса Bundle
- useStyle($name) - подключение файла стилей из бандла.
\TAO::bundle('MyBundle')->useStyle('name.js');
- useScript($name) - подключание файла скрипта из бандла.
\TAO::bundle('MyBundle')->useScript('name.js');