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