Подключение контент плагинов в свой компонент
Нередко после создания собственного компонента для Joomla нам необходимо что бы компонент обрабатывался контент плагинами!
Например мы можем сделать что бы наш компонент тоже выводил например модули в тексте нашего компонента после вставки , или выводить подсветку кода GeSHi
Итак возьмем пример кода вида для любого нашего компонента:
<?php // Запрет прямого доступа defined( '_JEXEC' ) or die; jimport( 'joomla.application.component.view' ); /** * View for current element */ class BlogViewItem extends JView { protected $item; /** * @param type $tpl */ public function display( $tpl = null ) { $this->item = $this->get( 'Item' ); parent::display( $tpl ); } }
Все изменения которые мы будем вносить будут относится к методу display() текущего вида, и к шаблону который будет выводить этот вид!
Для начала нам нужно получить параметры нашего приложения:
$params = JFactory::getApplication( 'site' )->getParams();
Далее для работы некоторых плагинов у нас должно быть поле text в нашем объекте item. Если его нет то мы можем объеденить из других полей, например:
$this->item->text = $this->item->introtext . $this->item->fulltext;
После этого подключаем класс который будет выполнять обработку наших событий и вызывать нужное в определенных плагинах:
$dispatcher = JDispatcher::getInstance();
И подключить группу плагинов с которой мы хотим работать:
JPluginHelper::importPlugin( 'content' );
Далее нам необходимо регистрировать события, некоторые события могут возвращать результат, некоторые проводят изменения в самом объекте и поэтому необходимо передавать объект по ссылке!
Пример вызова события которое не будет возвращать результат:
$dispatcher->trigger( 'onContentPrepare', array( 'com_content.article', &$this->item, &$params ) );
Пример события которое вернет результат и мы вставим этот результат в объект $item для того что бы его потом вывести в шаблоне:
$results = $dispatcher->trigger( 'onContentAfterDisplay', array( 'com_content.article', &$this->item, &$params ) ); $this->item->event->afterDisplayContent = trim( implode( "\n", $results ) );
После добавления всех обработчиков код нашего вида станет таким:
public function display( $tpl = null ) { //Получаем наш объект $this->item = $this->get( 'Item' ); //Получаем параметры $params = JFactory::getApplication( 'site' )->getParams(); //Объедением introtext и fulltext в text $this->item->text = $this->item->introtext . $this->item->fulltext; //Подключаем обработчик событий $dispatcher = & JDispatcher::getInstance(); //Подключаем плагины из группы контента JPluginHelper::importPlugin( 'content' ); //Вызываем событие onContentPrepare (подготовка контента) $dispatcher->trigger( 'onContentPrepare', array( 'com_content.article', &$this->item, &$params ) ); //вызываем событие которое выведет работу плагина после отображения заголовка $results = $dispatcher->trigger( 'onContentAfterTitle', array( 'com_content.article', &$this->item, &$params ) ); //вносим в объект результат работы который вернут плагины у которых есть событие onContentAfterTitle $this->item->event->afterDisplayTitle = trim( implode( "\n", $results ) ); //вызываем событие которое выведет работу плагина перед отображением контента $results = $dispatcher->trigger( 'onContentBeforeDisplay', array( 'com_content.article', &$this->item, &$params ) ); //вносим в объект результат работы который вернут плагины у которых есть событие onContentBeforeDisplay $this->item->event->onContentBeforeDisplay = trim( implode( "\n", $results ) ); //вызываем событие которое выведет работу плагина после отображения контента $results = $dispatcher->trigger( 'onContentAfterDisplay', array( 'com_content.article', &$this->item, &$params ) ); //вносим в объект результат работы который вернут плагины у которых есть событие onContentAfterDisplay $this->item->event->afterDisplayContent = trim( implode( "\n", $results ) ); parent::display( $tpl ); }
Вызывая метод trigger (регистрацию событий) мы должны передать два параметра:
первый параметр это название события и второй параметр это массив с данными которые передадутся в метод onContentAfterDisplay нашего плагина!
Вы наверно обратили внимание что в этом массиве один из параметров 'com_content.article', это не ошибка! Просто некоторые плагины проверяют $context и если мы укажем контекст своего компонента то он может не сработать!
После этого нам нужно внести в шаблон tmpl/default.php нашего вида изменения:
<?php //Запрет прямого доступа defined('_JEXEC') or die; ?> <div> <h1><?php echo $this->item->title; ?></h1> <?php //Выводим плагины которые среагировали на событие onContentAfterTitle echo $this->item->event->afterDisplayTitle; ?> ... какой то ваш код ... <?php //Выводим плагины которые среагировали на событие onContentBeforeDisplay echo $this->item->event->beforeDisplayContent; ?> <?php //выводим текст нашей записи! если в записи были встроены какие то плагины то // они будут обработаны и подключенны к тексту и наш текст уже выведется // с нашими плагинами echo $this->item->text; ?> <?php //Выводим плагины которые среагировали на событие onContentAfterDisplay echo $this->item->event->afterDisplayContent; ?> </div>
На этом все! Теперь плагины из группы content будут выводиться в любом созданном нами компоненте!
Вы так же можете подключать плагины и для модулей!
Если ваш компонент выводит на странице какой то список, то что бы вам обработать все элементы в списке плагинами нужно написать такой код:
//получаем список записей $items = $this->get( 'Items' ); //перебираем все записи в цикле for ( $i = 0, $n = count( $items ); $i < $n; $i++ ) { //получаем ссылку на запись в текущей итерации $item = &$items[$i]; //получаем объект обработчика событий $dispatcher = JDispatcher::getInstance(); //регистрируем событие $results = $dispatcher->trigger( 'onContentAfterTitle', array( 'com_content.article', &$item, &$params ) ); //добавляем к записи в текущей итерации результат обработки события $item->event->afterDisplayTitle = trim( implode( "\n", $results ) ); //делаем подобное для нужных событий } $this->items = $items;