Бандлы - 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
    • /pages/
      • page.phtml

Создание бандла

В общем случае для создания бандла достаточно следующих шагов:

  1. Заводим папку с именем бандла. В нее добавляем файл Bundle.php, в котором описываем одноименный класс, наследуемый от библиотечного \TAO\Bundle.
// local/bundles/MyBundle/lib/Bundle.php

namespace App\Bundle\MyBundle;

class Bundle extends \TAO\Bundle
{
   //какой-то код
}
  1. Подключаем бандл в системе, в файле 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');