Подключение контент плагинов в свой компонент
Нередко после создания собственного компонента для 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;