Создание системного плагина Joomla

09.06.2013

Теги: CMSJoomlaWeb-разработка

Напишем простой плагин Joomla для обработки события onBeforeCompileHead. Это событие позволяет видеоизменить любой элемент внутри тега <head> HTML-документа перед его выводом в браузер. С помощью этого плагина можно добавить, изменить или удалить мета-теги, js-скрипты, css-стили и т.п.

Событие onBeforeCompileHead инициируется в методе fetchHead() класса JDocumentRendererHtml (из файла libraries/joomla/document/html/renderer/head.php). Метод считывает данные для элемента <head> HTML-документа и выводит их в буфер в формате HTML для дальнейшей отправки браузеру. Код, инициирующий данное событие:

public function fetchHead(&$document)
{
    // Trigger the onBeforeCompileHead event
    // (skip for installation, since it causes an error)
    $app = JFactory::getApplication();
    $app->triggerEvent('onBeforeCompileHead');
    // ..........
}

Наш системный плагин будет очень простым. Он добавит мета-тег revised (исправлено), исходя из значения параметра, введенного администратором сайта

<meta name="revised" content="Vasya Pupkin, 9 June 2013" />

где атрибут content как раз и содержит текст, введенный администратором.

Для начала разберемся, каким образом в объекте типа JDocumentHtml хранятся данные HTML-заголовка. Класс JDocumentHtml имеет метод getHeadData(), позволяющий получить всю необходимую нам информацию. Добавим print_r() внутрь метода fetchHead():

public function fetchHead(&$document)
{
    print_r($document->getHeadData());
    // Trigger the onBeforeCompileHead event
    // (skip for installation, since it causes an error)
    $app = JFactory::getApplication();
    // ..........
}
Результат:
Array
(
  [title] => Home
  [description] => My description
  [link] => 
  [metaTags] => Array
    (
      [http-equiv] => Array
        (
          [content-type] => text/html
        )

      [standard] => Array
        (
          [keywords] => My keywords
          [rights] => My rights
        )
    )
  [links] => Array
    (
      ..........
    )
  [styleSheets] => Array
    (
      ..........
    )
  [style] => Array
    (
      ..........
    )

  [scripts] => Array
    (
      ..........
    )
  [script] => Array
    (
      ..........
    )
  [custom] => Array
    (
      ..........
    )
)

Создадим папку plugins/system/mymeta для нашего плагина и поместим в нее три файла:

index.html

<!DOCTYPE html><title></title>

mymeta.php

<?php
/**
 * @copyright    Copyright (C) 2013 Vasya Pupkin. All rights reserved.
 * @license      GNU General Public License version 2 or later; see LICENSE.txt
 */

// no direct access
defined('_JEXEC') or die;

/**
 * Пример системного плагина
 */
class plgSystemMyMeta extends JPlugin
{
  function onBeforeCompileHead()
  {
    if ( $this->params->get('revised') ) {
      $document = JFactory::getDocument();
      $headData = $document->getHeadData();
      $headData['metaTags']['standard']['revised'] = $this->params->get('revised');
      $document->setHeadData($headData);
    }
  }
}

mymeta.xml

<?xml version="1.0" encoding="utf-8"?>
<install version="2.5" type="plugin" group="system">
  <name>My Meta Plugin</name>
  <author>Vasya Pupkin</author>
  <creationDate>June 2013</creationDate>
  <copyright>Copyright (C) 2013 Vasya Pupkin. All rights reserved.</copyright>
  <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
  <authorEmail>pupkin.v@mail.ru</authorEmail>
  <authorUrl>www.pupkin.ru</authorUrl>
  <version>2.5.0</version>
  <description>My meta plugin</description>
  <files>
    <filename plugin="mymeta">mymeta.php</filename>
    <filename>index.html</filename>
  </files>
  <config>
    <fields name="params">
      <fieldset name="basic">
        <field name="revised" type="text"
          description="Meta revised text for content attribute"
          label="Revised content"
          default=""
          size="50"
        />
      </fieldset>
    </fields>
  </config>
</install>

Теперь наш плагин готов к применению. Но он пока неизвестен в установке Joomla. Хотя все файлы находятся в нужных папках, для нового плагина отсутствует запись в таблице БД #__extensions.

Воспользуемся средством «Discover (Обнаружение)». В административной части переходим Extensions=>Extensions Manager=>Discover (Расширения=>Менеджер расширений=>Поиск). Щелкаем по иконке «Найти».

Обнаружение плагина средством Discover

Отмечаем найденный плагин (флажок слева) и щелкаем по иконке «Install (Установить)». В итоге получим сообщение об успешной установке плагина.

Теперь проверим наш плагин в действии. Идем Extensions=>Plugin Manager (Расширения=>Менеджер плагинов), фильтруем список всех плагинов по слову «meta», активирум наш плагин, щелкнув по иконке «Enabled (Включить)».

Активация плагина My Meta

Далее переходим к редактированию плагина, вводим любые данные в поле «Revised content»

Настройки плагина My Meta

Теперь переходим в общедоступную часть сайта, обновляем страницу, смотрим исходный код:

Результат работы плагина My Meta

Поиск: CMS • Joomla • Web-разработка

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.