•  
  •  
  •  
  •  
1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 Голос)
Как создать собственный плагин - 5.0 out of 5 based on 1 vote

Мы займемся написанием простого плагина, который будет использоваться для события "onBeforeCompileHead". Данное событие относится к типу "system". Это событие стало доступным с версией Joomla 1.6, и обеспечивает для нас изменение HTML-элемента head  до начала его рендеринга. Это значит, что нам доступно изменение любого HTML-элемента, который располагается в head: meta, link или script.

Чем будет заниматься наш плагин?

Событие "onBeforeCompileHead" вызывается в методе fetchHead() класса JDocumentRendererHtml. Этим методом считываются данные для HTML-элемента head, которые находятся в объекте документа и выводится в буфер в HTML-формате. Следующим кодом вызывается данное событие:

// Trigger the onBeforeCompileHead event
$app = JFactory::getApplication();
$app->triggerEvent('onBeforeCompileHead');

Если нами будет совершён просмотр исходного кода HTML-страницы, то мы сможем обнаружить некоторые элементы meta внутри элемента head:

<meta name="robots" content="index, follow" />
<meta name="keywords" content="My keywords." />
<meta name="rights" content="My rights." />
<meta name="language" content="en-GB" />

Нашим плагином будет добавляться мета-тег "revised", в основе которого лежит параметр, который пользователем вводится для плагина. К примеру, процесс вывода нашего плагина может иметь следующий вид:

<meta name="revised" content=" , 16 октября 2012" />

здесь атрибут "content" выступает текстом, который указывается в параметре плагина.

Для достижения подобного, нам потребуется понимание того, как объект JDocumentHTML производит сохранение данных для HTML-элемента head. Займемся проведением небольшого расследования.

Метод fetchHead() класса JDocumentRendererHead (в котором вызывается событие "onBeforeCompileHead"), позволяет нам увидеть, что переменная $document заложена в сигнатуру метода. Это объект JDocumentHTML, который обладает методом getHeadData(), которым возвращаются head-данные для документа или страницы. Если мы займемся добавлением команды var_dump($document->getHeadData()); в метод fetchHead() (к примеру, поставим ее перед кодом, которым вызывается событие), а далее проверим страницу, то сможем увидеть длинный дамп вывода getHeadData(). Часть данного дампа будет следующей:

array
'title' => string 'Home' (length=4)
'description' => string 'My description.' (length=15)
'link' => string '' (length=0)
'metaTags' =>
           array
           'http-equiv' =>
                       array
                       'content-type' => string 'text/html' (length=9)
           'standard' =>
                       array
                       'robots' => string 'index, follow' (length=13)
                       'keywords' => string 'My keywords.' (length=12)
                       'rights' => string 'My rights.' (length=10)
                       'language' => string 'en-GB' (length=5)

Если мы сравним это с HTML кодом, который был представлен раньше, то нам удастся увидеть, что элементы meta с атрибутом "name" хранятся в объекте как ассоциативный массив внутри элемента "standard", который расположен внутри компонента "metaTags". Атрибут "name" выступает в роли ключа (к примеру, "robots"), а атрибут "content" это значение (к примеру, "index, follow").

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

Это значит, что алгоритму работы в нашем плагине будет присуща следующая форма:

  1. Чтение существующих head-данных из документа. Это будет тем массивом, о котором говорилось ранее.
  2. Добавляем элемент в ассоциативный массив, который находится в элементе "standard" в элементе "metaTags". Ключ для данного элемента представлен "revised", а значение его заключается в данных, которые пользователем введены для параметра.
  3. Запись измененного массива в объект документа, с использованием метода setHeaderData(). Он выступает в роли зеркального отражения метода getHeaderData().
  4. Нам необходимо это сделать лишь в тот момент, когда существуют какие-либо данные в параметре плагина. Если данных отсутствуют, то ничего не происходит.

Создание установочного файла

Нет необходимости в усложнении себе задания. Поэтому дадим нашему плагину простое название - My Meta.

Переходим к созданию для него новой папки (к примеру, mymeta). Она должна быть дополнена пустым файлом index.html и файлом mymeta.xml, где будет следующее содержимое:

<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="system" method="upgrade">
    <name>PLG_SYSTEM_MYMETA</name>
    <author>Ваше имя</author>
    <creationDate>Дата создания</creationDate>
    <copyright>Информация о копирайте</copyright>
    <license>Информация о лицензии</license>
    <authorEmail>Ваш адрес электронной почты</authorEmail>
    <authorUrl>Ваш сайт</authorUrl>
    <version>1.0.0</version>
    <description>PLG_SYSTEM_MYMETA_XML_DESCRIPTION</description>
 
    <files>
        <filename plugin="mymeta">mymeta.php</filename>
        <filename>index.html</filename>
        <folder>language</folder>
    </files>
 
    <config>
        <fields name="params">
            <fieldset name="basic">
                <field name="revised" type="text"
                    description="PLG_SYSTEM_MYMETA_FIELD_REVISED_DESC"
                    label="PLG_SYSTEM_MYMETA_FIELD_REVISED_LABEL"
                    filter="string"
                    default=""
                    size="50"
                />
            </fieldset>
        </fields>
    </config>
</extension>

Присмотритесь внимательно к строке:

<extension version="2.5" type="plugin" group="system" method="upgrade">

Атрибут "group" обозначает тип нашего плагина. Поэтому, в конце установки он будет помещен в директорию plugins/system.

Также, нами создан элемент fields с атрибутом "name", значение которого равняется "params". Внутри нами расположен элемент fieldset "basic", в котором содержится нужное для нас поле. Все это расположено внутри элемента config.

Если бы нами не создавались элементы fields с атрибутом "name", то мы бы не могли заниматься редактированием параметров плагина. Особенность заключается в том, что для формы редактирования плагина применяется файл разметки (administrator/components/com_plugins/views/plugin/tmpl/edit_options.php). Ним производится поиск элемента fields с именем "params" и включаются содержимые в нем элементы fieldset в качестве опций формы.

Внутри элемента fieldset нами было определено текстовое поле "revised". Это означает, что пользователю доступна возможность указать свое значение этому параметру. Благодаря filter="string" нами вводится ограничение для допустимых символов в тексте. Фильтрация производится методом clean() класса JFilterInput.

Файл манифеста создан. Пришел час заняться непосредственным написанием кода плагина.

Создание кода плагина

Создаем в папке mymeta файл mymeta.php, в котором будет следующее содержимое:

<?php
// Запрет прямого доступа.
defined('_JEXEC') or die;
 
/**
* Тестовый MyMeta плагин.
*/
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);
        }
    }
}

Нами назван наш класс plgSystemMyMeta ввиду имеющегося соглашения по именованию плагинов:

"plg" + <тип плагина> + <имя файла плагина>

Класс нами дополнен методом с названием onBeforeCompileHead() и его название в точности совпадает с названием события, которое является ориентировочным. Вначале нами проверяется то, что есть ли что-то в параметре "revised" в нашем плагине. Если нет, то обработка пропускается. Параметры плагина нами используются с помощью свойства $params. Это объект типа JRegistry,  который используется для хранения параметров плагина.

Если ответ другой, то переходим к обработке. Нами получается объект документа и сохраняется результат метода getHeadData() в переменной $headData.

Далее следует создание нового элемента в ассоциативном массиве с названием "revised" и установка его значение, которое будет равно значению параметра плагина. Следует обратить внимание на то, что наш компонент находится в массиве, который, также, состоит в ещё одном массиве. Это мы видели в дампе вывода getHeadData().

Добавление языковых файлов

Последний шаг до проверки создаваемого плагина заключается в добавлении языкового файла. Вспоминаем о нашем файле манифеста:

<files>
           <filename plugin="mymeta">mymeta.php</filename>
           <filename>index.html</filename>
           <folder>language</folder>
</files>

Элементом folder указывается то, что папка нашего плагина должна содержать подпапку "language".

Когда нами создается плагин, нам доступен выбор: расположение языковых файлов в папке плагина или перенос их в папку adminstrator/languages. Для работы с расширениями вебмастера советуют прибегать к расположению всех файлов расширения в отдельности от базовых файлов Joomla. Это значит, что языковым файлам расширения тоже следует располагаться в папке расширения. Нами будет использоваться эта практика и для создания папки language, которая будет подпапкой mymeta. В папке language необходимо создание ещё двух подпапок под каждый язык: en-GB и ru-RU. Не забываем о необходимости размещения в них пустого файла index.html.

Наш пример отличается использованием четырех языковых файлов, по паре на каждый язык:

en-GB.plg_system_mymeta.ini

en-GB.plg_system_mymeta.sys.ini

Их месторасположение - mymeta/language/en-GB.

ru-RU.plg_system_mymeta.ini

ru-RU.plg_system_mymeta.sys.ini

Их месторасположение - mymeta/language/ru-RU.

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

Файл plg_system_mymeta.ini выступает в роли главного языкового файла. В нем содержатся языковые строки, которые будут применяться при выполнении кода плагина, а также в том случае, когда плагин будет открыт для проведения изменений с помощью «Менеджера плагинов».

Наполнение файла en-GB.plg_system_mymeta.ini:

 PLG_SYSTEM_MYMETA_FIELD_REVISED_LABEL="Revised сontent"

PLG_SYSTEM_MYMETA_FIELD_REVISED_DESC="Meta revised text for content attribute."

Наполнение файла ru-RU.plg_system_mymeta.ini:

PLG_SYSTEM_MYMETA_FIELD_REVISED_LABEL="Содержимое revised"

PLG_SYSTEM_MYMETA_FIELD_REVISED_DESC="Текст для атрибута content meta-элемента revised."

Файл, в котором название содержит .sys применяется в целях перевода имени, когда оно просматривается с помощью списка в «Менеджере расширений» либо «Менеджере плагинов». Также, нами размещается описание нашего плагина в этот файл для того перевода описания в сообщении, которое будет отображаться во время установки плагина.

Наполнение файла en-GB.plg_system_mymeta.sys.ini:

PLG_SYSTEM_MYMETA="System - My Meta"
PLG_SYSTEM_MYMETA_XML_DESCRIPTION="Adds meta element with the name revised."

Мы закончили с созданием плагина. Следует заняться тестированием его работы.

Тестирование плагина

Переходим к запаковыванию содержимого папки mymeta с помощью архива (zip, rar) или скачиваем его непосредственно с нашего ресурса. Для установки обращаемся к «Менеджеру расширений».

Переходим к "Расширениям – Менеджеру плагинов" и в фильтре "- выбор типа -" выбираем "system". Список будет обладать нашим плагином "Система – My Meta". Кликаем по нему, и мы переходим к редактированию параметров плагина:

 Создание собственного плагина

Изменяем состояние плагина на "Вкл", вводим текст "revised" и сохраняем. Далее переходим к главной странице и занимаемся просмотром исходного кода при помощи браузера. Вам будет доступно что-то похожее на:

<meta name="robots" content="index, follow" />
<meta name="keywords" content="My keywords." />
<meta name="rights" content="My rights." />
<meta name="language" content="en-GB" />
<meta name="revised" content=" " />
<meta name="description" content="My description." />

Нами может быть отмечено, что мета-тег "revised" относится к списку мета-тегов. Финальным тестом является возвращение к "Менеджеру плагинов" и удаление содержимого параметра "revised". Далее необходимо обновить страницу и перейти к проверке исходного кода. Мета-тег с именем "revised" должен исчезнуть, так как нами удалены данные из параметров плагина.

Поздравляем! Вами пройден курс по созданию своего плагина на Joomla. Следующая статья даст возможность рассмотреть переопределение базовых классов Joomla при помощи плагина.

{phocadownload view=file|id=151|target=s}

Портфолио
Память о Вас и Ваших близких на многие поколения
Подробнее
Прокат металла
Подробнее
Интернет-магазин кожи и меха
Подробнее
100% оригинальная парфюмерия в Москве
Подробнее
Вьетнамский ресторан премиум класса
Подробнее
Внедрение информационных систем
Подробнее
Организация международных конференций
Подробнее
Производство молочной продукции
Подробнее
Спортивный сайт
Подробнее
Интернет-магазин мебели и аксессуаров
Подробнее
Интернет-магазин электротранспорта
Подробнее
Сайт института актуальной экономики
Подробнее
Наши клиенты
Парк развлечений Boom Zoom
Алгор
Норбит
Molga Consulting
Metrotile
Нетология
Monqi
Премиум Пак
Aasha Herbals
Аджва
Салон красоты Сударушка
Пава
ТЦ &quot;Панфиловский&quot;
Фитнес Лаборатория
Система Главбух
Vanguard
GoAsia
ТЦ «Солнечный ветер»
Teledoc
Tchernov Cable
Отзывы
Благодарю компанию web-now.pro за помощь в разработке и запуске проекта POLITSECRETS.RU. Перед нами стояла задача – внедрить проект в сжатые сроки и по оптимальной цене. Порадовало то, что мне подроб...
Вера БлашенковаСекреты успешных выборов, Москва... апр.2016
Мне очень понравился подход с которым нас встретили "Ваша задача заниматься бизнесом, наша - сделать Вам представительство в сети". После этого ребята разработали полное тз на проект, мы внесли пожела...
МаксимIT-TASK, Москва... янв.2016
Работа проделана хорошо! Дизайнер и менеджер на отлично. Надеюсь на сотрудничество в дальнейшем. Есть шероховатости в деталях по задачам, но приятно сказывается оперативность и желание исправить, внес...
БруноСоциальная сеть След Жизни, Москва... янв.2016
Работой остались очень довольны. К работе подходят ответственно, аккуратно, открыто. Проект был сдан чуть раньше срока, по ходу работы возникали изменения, все они принимались безоговорочно, работа вы...
ЕвгенийМагазин текстиля, Москва... дек.2015
Сотрудничаем с 2007 года и сделали не один проект. Самое главное - команда умеет отстаивать своё мнение и постоянно развивается.
МарияМеждународные конференции, Москва... дек.2015
Спасибо всему коллективу компании! Разработали красивый и что самое главной рабочий интернет магазин! Реклама настроена и запущена, продажи идут, бизнес развивается! Нам постоянно подсказывают о новых...
ВадимИнтернет магазин Aromatic.pro, Москва... сен.2015
Большое спасибо команде за оперативность, качественные работы, отличный креатив и привлекательные цены!
Виктория, ОАО "Фармстандарт... июль.2015
Здравствуйте уважаемые партнеры! С наступающим Новым Годом! Желаю Вам дальнейшего процветания и успехов в Вашей благородной работе! С вами приятно сотрудничать! Очень благодарен Вам за своевременное о...
Сергей ЮрченкоКинотруд, Москва... дек.2014
Благодарим команду Brand Now и лично Дениса Логинова за оригинальное видение,разнообразие идей, четкость взаимодействия и безукоризненное соблюдение сроков выполнения проекта! Планируем продолжить сот...
ТатьянаBizness Linkerz... июль.2014
Компания КУН выражает благодарность за сотрудничество: непростая задача была выполнена в требуемые сроки и полностью удовлетворила заявленному ТЗ. Приятно удивила готовность Генерального директора нач...
Мария, Компания КУНhttp://www.kuhn.com/... апр.2014
Все отзывы
Добавить отзыв