Joomla 1.5: Создание плагинов группы Content - PHP - файл плагина
| Индекс материала |
|---|
| Joomla 1.5: Создание плагинов группы Content |
| PHP - файл плагина |
| INI - файл плагина |
| Все страницы |
PHP - файл плагина
Теперь создайте php - файл, и поместите следующий код в самом его начале:
// запрет прямого доступа defined( '_JEXEC' ) or die( 'Restricted access' );
Это предотвращает прямое обращение к этому файлу. Всегда начинайте свой php – код для Joomla 1.5 с этих строк. После этого нужно импортировать файл, содержащий описание класса JPlugin из библиотеки Joomla 1.5
jimport( 'joomla.plugin.plugin' );
Фактически параметр функции jimport – это путь к файлу требуемого класса, от директории libraries/, но вместо разделителя директорий – слеша «/» используется точка ( Так наверно красивее, и круче, и конечно медленнее
).
Далее объявляем класс с именем plg|Группа|Имяплагина - он обязательно должен расширять класс JPlugin.
Здесь, символами «|» я разделил имя класса на составные синтаксические элементы: обязательная приставка plg, далее с большой буквы имя группы плагина, в нашем случае Content, и после уже название плагина. Именно в таком виде синтаксический анализатор Joomla 1.5 ждёт от вас имена классов плагинов.Cимвол «|» - в реальном имени не нужен!
class plgContentNameofplugin extends JPlugin
{
...
Обратите внимание на использование заглавных букв в стиле camelCase - это обязательно!
Строим наш плагин дальше…
Ниже заморочка с конструктором - всего лишь попытка сохранить обратную совместимость с PHP 4 - версии, в которой имя конструктора совпадало с названием класса.
function plgContentNameofplugin( &$subject, $params )
{
parent::__construct( $subject, $params );
}
Для плагинов группы Content существует несколько событий, на которые они реагируют. Вы можете выбрать из следующего списка:
onBeforeContentSave: Это – событие происходит перед тем, как контент будет сохранен в базу данных.
onAfterContentSave: Это - событие, происходит после того, как контент сохранен в базу данных.
onPrepareContent: Это – начало подготовки контента для отображения. Больше всего подходит для обработки плагинами контента.
onAfterDisplayTitle: Плагины этого события могут разместить какую то информацию между заголовком и телом содержимого.
onBeforeDisplayContent: Плагины этого события могут разместить информацию, которая должна быть помещена непосредственно перед выводимым контентом.
onAfterDisplayContent: Плагины этого события могут разместить информацию, которая должна быть помещена непосредственно после выводимого контента
Более подробнее о событиях и типах плагинов, можно прочитать
Примеры заготовок кода плагинов группы content для разных событий:
onAfterContentSave
function onAfterContentSave( &$article, $isNew )
{
global $mainframe;
// код плагина здесь ...
return true;
}
Параметры :
- $article : ссылка на объект JTableContent, который хранит данные статьи и которому предстоит сохраниться в БД.
- $isNew : bool - true, если контент новый.
onAfterContentSave
function onAfterContentSave( &$article, $isNew )
{
global $mainframe;
// код плагина здесь ...
return true;
}
Параметры :
- $article : ссылка на объект JTableContent, который был сохранен в БД, который хранит данные статьи.
- $isNew : bool - true, если контент новый.
onPrepareContent
function onPrepareContent( &$article, &$params, $limitstart )
{
global $mainframe;
// код плагина здесь ...
// не возвращает ничего.
}
Параметры :
- $article: ссылка на статью, которая должна быть отображена.
- $params: ссылка на ассоциативный массив соответствующих параметров статьи *
- $limitstart: целое число – номер страницы в механизме pagination
Для следующих событий различным будет только имя метода, а внешние интерфейсы этих методов одинаковы, поэтому я сгруппирую их в одну запись:
onAfterDisplayTitle, onBeforeDisplayContent, onAfterDisplayContent
function onAfterDisplayTitle( &$article, &$params, $limitstart )
{
global $mainframe;
// Код плагина здесь ...
// Возвращается строковое значение для этого события будет отображено в placeholder.
// Как правило шаблоны отображают placeholder после разделителя статей.
return '';
}
Параметры :
- $article: ссылка на статью, которая должна быть отображена.
- $params: ссылка на ассоциативный массив соответствующих параметров статьи *
- $limitstart: целое число – номер страницы в механизме pagination
* Массив параметров статьи это те параметры, которые мы задаём в настройках материала/статьи, например показывать ли дату создания, иконку печать и т.п. вот несколько переменных из той оперы:
show_title=1 link_titles=0 show_intro=1 show_section=1 link_section=0 show_category=0 link_category=0 show_author=0 show_create_date=0 ...
Ниже приведён пример кода для плагина loadmodule - группы Content. Он отображает модули в теле статьи, там где находит маркеры следующего вида: – соответственно плагин знает из какой позиции подгружать модули в то, или иное место.
Ещё раз повторю плагин loadmodule - реально существующий плагин, если вы соберётесь повторить этот пример проверьте, что плагин loadmodule - уже не установлен в вашей системе, иначе вы попросту не сможете его установить.
<?php
// Запрет прямого доступа
defined( '_JEXEC' ) or die( 'Restricted access' );
// Импортируем необходимый класс JPlugin
jimport('joomla.plugin.plugin');
// Описываем класс, расширяющий JPlugin
class plgContentLoadmodule extends JPlugin
{
/**
* Плагин загружает модули позиций, указанных в контенте таким маркером:
*
*/
public function onPrepareContent( &$row, &$params, $page=0 )
{
// Получаем объект для работы с БД:
$db = JFactory::getDBO();
// Простая и быстрая проверка, нужен ли вообще в данной статье наш плагин.
// Если в статье вообще не присутствует слово 'loadposition' – вырубаем плагин
if ( JString::strpos( $row->text, 'loadposition' ) === false ) {
return true;
}
// Шаблон регулярки:
$regex = '//i';
// Проверка, включён ли наш плагин:
if ( !$this->params->get( 'enabled', 1 ) ) {
$row->text = preg_replace( $regex, '', $row->text );
return true;
}
// Ищем все вхождения нашего шаблона, и помещаем его в массив $matches
preg_match_all( $regex, $row->text, $matches );
// Кол-во вхождений
$count = count( $matches[0] );
// Плагин сработает, только если есть совпадения с шаблоном регулярки:
if ( $count ) {
// Получаем параметры плагина
$style = $this->params->def( 'style', -2 );
// Удаляем ненужные уже плейсхолдеры – описание функции см. ниже
$this->_process( $row, $matches, $count, $regex, $style );
}
// Не возвращаем никакого значения
}
// Служебная закрытая функция, которая удаляет плейсхолдеры { loadposition ... }
protected function _process( &$row, &$matches, $count, $regex, $style )
{
for ( $i=0; $i < $count; $i++ )
{
$load = str_replace( 'loadposition', '', $matches[0][$i] );
$load = str_replace( '{', '', $load );
$load = str_replace( '}', '', $load );
$load = trim( $load );
// Подгружаем модули, указанной позиции и стиля см. описание ниже:
$modules = $this->_load( $load, $style );
// Заменяем вхождение шаблона на вывод модуля:
$row->text = preg_replace( '{'. $matches[0][$i] .'}', $modules, $row->text );
}
// удаляет плейсхолдеры
$row->text = preg_replace( $regex, '', $row->text );
}
// Служебная закрытая функция – подгружает модули нужной позиции и стиля:
protected function _load( $position, $style=-2 )
{
// Получаем ссылку на объект документ:
$document = &JFactory::getDocument();
// Получаем визуализатор модулей:
$renderer = $document->loadRenderer('module');
// Устанавливаем значение параметров для модуля:
$params = array('style'=>$style);
$contents = '';
// Собираем вывод модулей в переменную, которую затем вернём
foreach ( JModuleHelper::getModules($position) as $mod ) {
$contents .= $renderer->render($mod, $params);
}
return $contents;
}
}
Joomla 1.5: Создание плагинов группы Content - PHP - файл плагина
).