Статей, посвященных разработке расширений для Joomla много, но почему то все они начинаются с установочного файла, архивировании его и установке. Даже официальная документация изложена в такой манере.

Несколько странно, не правда ли? Это все равно, что если бы статья о программировании начиналась с создания дистрибутива, а не с изложения основных принципов разработки.

Покажем на примере, что для начала совершенно нет никакой необходимости в установочном архиве. Более того, я постараюсь показать набор минимально необходимых действий, чтобы плагин заработал.

 

Для примера разработаем ну очень простой плагин, заменяющий текстовое обозначение смайлика на его графическое обозначение.

Попросту, говоря нужно заменить текст ":- )" на картинку со смайликом.

Поскольку фантазия разработчика может нас повести и дальше смайликов, но назовем плагин smartlinks.

Совсем немного теории

Joomla поддерживает различные виды плагинов, каждый вид плагина имеет свои события.

Наш плагин будет обрабатывать содержимое, а значит относится к виду Content. Для этого вида определены следующие события, из которых нас прежде всего интересует событие onContentPrepare, обработчик которого вызывается в момент подготовки содержимого.

В документации события ошибочно сказано, что событие имеет 5 параметров, на самом деле их 4, в чем нетрудно убедится посмотрев на код любого из плагинов.

Итак приступим

Создаем в папке plugins/content корневой папки Joomla папку с именем плагина.

В этой папке создаем файл с именем как плагин - smartlinks, это собственно и будет папка нашего плагина.

Теперь в этой папке создадим файл smartlinks.php, в котором и будет реализован плагин.

С точки зрения CMS, плагин - класс, унаследованный от предка JPlugin, поэтому объявление класса нашего плагина будет таким:

class PlgContentSmartlinks extends JPlugin

Обратите внимание на название класса. Joomla требовательная к именам. Так, например, имя класса плагина должно состоять из префикса Plg, типа плагина Content и собственно имени - Smartlinks. Другими словами, реализация класса нашего плагина будет такая:

class PlgContentSmartlinks extends JPlugin
{
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
	return true;
	}
}  

Пока он не делает ничего, но пока и не надо. Добавив программные теги php и функцию недопущения прямого вызова получим полный модуль "пустого" плагина.


<?
defined('_JEXEC') or die;

class PlgContentSmartlinks extends JPlugin
{
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
	return true;
	}
}  

Обратите внимание на отсутствие закрывающегося тега php. Это сделано в соответствии с рекомендациями Joomla, она закрывает теги самостоятельно.

Однако, если вы опубликуете файл плагина, то на Joomla это не произведет никакого впечатления. Дело в том, что систему нужно оповестить о том, что плагин существует. Официально делать это рекомендуется с помощью установочного файла, однако наш код еще долек от совершенства и мы просто сообщим Joomla о его наличии.

Для этого можно подключиться к базе данных с помощью PhpMyadmin и выполним следующий запрос, заменив "sy" на префикс вашей базы данных.


INSERT INTO `sy_extensions` (`extension_id`, `name`, `type`, `element`, `folder`,
 `client_id`, `enabled`, `access`, `protected`, `manifest_cache`, `params`, 
 `custom_data`, `system_data`) 
VALUES (NULL, 'plg_content_smartlinks', 'plugin', 'smartlinks', 'content', 
1, '1', '1', '0', '', '', '', '')



После этого можно зайти в панель управления Joomla и убедиться, что плагин установлен.
Самое время заняться функционалом замены строк.
Для одного смайлика все просто, можно использовать функцию str_replace, которая ищет все вхождения подстроки в строку и заменяет на другую подстроку.


<?
defined('_JEXEC') or die;

class PlgContentSmartlinks extends JPlugin
{
	public function onContentPrepare($context, &$row, &$params, $page = 0)
	{
        $row->text=str_replace(':- )','<img src=/images/smile.gif />', $row->text);
	return true;
	}
}

В коде в символьное изображение смайлика добавлен пробел, в противном случае картинка показалась бы в исходнике. 

Копируем файл с изображением смайлика в папку images. И наконец то пробуем ввести в текст смайлик и убеждаемся, что все у нас получилось