Немного теории

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

  1. Плагин - это дополнительное расширение для компонента, которое исполняется автоматически вместе с компонентом. Плагин можно вызвать в цикле программы, или задать действия на определённый код, скажем заменить текст при обнаружении какого либо текста {myplagin}, или совершать действия с картинками, формами, видео и.т.д.
  2. Группы плагинов - бывают разные, для контента, для редакторов, расширений и.т.д.
    Authentication (Аутентификация)
    Joomla поддерживает 4 различных методов авторизации: GMail Joomla! LDAP OpenID Также можно создать свои методы авторизации пользователя. В этой группе существует только один метод onUserAuthenticate В плагине мы можем установить значение следующих свойств:

    Свойство Описание birthdate Дата рождения пользователя country Страна пользователя email E-mail адрес пользователя error_message Сообщение об ошибке или отмена авторизации fullname ФИО gender Пол language Язык postcode Почтовый индекс status Статус авторизации timezone Часовой пояс username Логин

    Свойство status используется для определения результата авторизации. Таблица содержит три константы, которые может содержать свойство status:

    Константа Описание JAUTHENTICATE_STATUS_CANCEL Авторизация отменена JAUTHENTICATE_STATUS_FAILURE Ошибка авторизации JAUTHENTICATE_STATUS_SUCCESS Авторизация прошла успешно

    По-умолчанию в Joomla опубликован только один плагин авторизации - Joomla!. Также вы можете опубликовать LDAP, GMAIL и OpenId. onAuthenticate

    Описание Происходит, когда пользователь авторизируется на сайте Параметры username Логин password Пароль response Ссылка на объект JAuthenticationResponse

  3. Captcha (Капча)
    Капча помогает бороться со спамом, заставляя пользователя вводить некоторый текст, который основан на искаженном изображении. Капча появилась в Joomla начиная с версии 2.5. Она реализована с помощью трех событий: onInit, onDisplay и onCheckAnswer.
  4. Content (Контент)
    Плагины группы content, позволяют обрабатывать элементы контента, прежде чем вывести его на экран. Наиболее часто используемое событие - это onContentPrepare. Это событие запускается самым первым.

    Таких обработчиков несколько:
    1 .onContentAfterDelete
    2. onContentAfterDisplay
    3. onContentAfterSave
    4. onContentAfterTitle
    5. onContentBeforeDelete
    6. onContentBeforeDisplay
    7. onContentBeforeSave
    8. onContentBeforeTitle
    9. onContentChangeState
    10. onContentPrepare
    11. onContentPrepareData
    12. onContentPrepareForm
    Полный список и описание этих событий описано на оф сайте joomla. Каждый из этих параметров по разному вызывает событие плагина.

  5. Дальше идут плагины Contacts (Контакты), Editors (Редакторы), Editors-XTD, Extension (Расширение), Quickicon (Быстрый запуск), Search (Поиск), System (Система), User (Пользователь). Все группы описывать долго да и каждая из них заслуживает отдельной статьи.

Все эти параметры советую посмотреть на оф сайте joomla и разобрав стандартные плагины joomla. Так как в интернете мало описания про события.

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

Для начала выберем для чего будем создавать плагин, в данной статье для контента joomla Content. Поэтому создайте файлы:

  1. socialjungle.xml
  2. socialjungle.php
  3. socialjungle/twitter-24.png
  4. language/ru-RU/ru-RU.plg_content_socialjungle.ini

Как видите всего 4 файла, в большинстве случаев больше файлов и не надо.

Теперь заполним файл socialjungle.xml и зададим там параметры которые можно будет задать в административной части. Код прокомментирован.

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.0" type="plugin" group="content" method="upgrade">
<!--Имя плагина которое отображается в расширениях -->
	<name>socialjungle</name>
<!--Дата создания плагина-->
	<creationDate>2013-03-26</creationDate>
<!--Автор плагина-->	
	<author>Ваня</author>
<!--Почта автора-->	
	<authorEmail>vanya@pupkin.com</authorEmail>
<!--Сайт автора-->		
	<authorUrl>http://joomla-umnik.ru</authorUrl>
<!--Копирайт-->	
	<copyright>Copyright (C) 2013 Social jungle</copyright>
<!--Лицензия-->		
	<license>http://www.gnu.org/licenses/gpl-3.0.html GNU/GPL</license>
<!--Версия плагина-->		
	<version>1.0</version>
<!--Описание плагина-->	
	<description>Плагин Social jungle это плагин социальных закладок для joomla.</description>
<!--Файлы которые нужно установить где socialjungle это папка куда нужно установить название должно совпадать с названием плагина -->	
	<files>
	   <filename plugin="socialjungle">socialjungle.php</filename>
	   <folder>socialjungle</folder>
	</files>

<!--Языковые файлы сайта-->	
		<languages>
		   <language tag="ru-RU">language/ru-RU/ru-RU.plg_content_socialjungle.ini</language>
		</languages>


<!--Конфигурация, такие параметры как default="1" задают установку этих значений по умолчанию когда их установили-->			
	<config>
		<fields name="params">

			<fieldset name="basic">
				<field name="twitter" type="list"
					default="1"
					label="PLG_EXTENSION_SOCIALJUNGLE_TWITTER">
					<option value="0">PLG_EXTENSION_SOCIALJUNGLE_TWITTER_OF</option>
					<option value="1">PLG_EXTENSION_SOCIALJUNGLE_TWITTER_ON</option>
				</field>

				<field name="textalign" type="list"
					default="0"
					label="PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN">
					<option value="left">PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_LEFT</option>
					<option value="center">PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_CENTER</option>
					<option value="right">PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_RIGHT</option>					
				</field>	

				<field name="pisition" type="list"
					default="0"
					label="PLG_EXTENSION_SOCIALJUNGLE_POSITION">
					<option value="0">PLG_EXTENSION_SOCIALJUNGLE_POSITION_ONE</option>
					<option value="1">PLG_EXTENSION_SOCIALJUNGLE_POSITION_TWO</option>
					<option value="2">PLG_EXTENSION_SOCIALJUNGLE_POSITION_THREE</option>					
				</field>
					
			</fieldset>		
		</fields>	
	</config>		
</extension>

Задать имена для этих полей можно любые все они хранятся в таблице бд ваш префикс_extensions соответственно тут же задаётся описание подсказка и параметры. У нас всего три параметра кнопка соц закладки, выбор позиции, влево, вправо, по центру и положение на странице.

Код плагина socialjungle.php

Код плагина умещается всего в 1 файле, больше собственно и не надо, максимум больше файлов бывает если используются библиотеки js, jquery. В joomla 2.5 используется if ($menu->getActive() == $menu->getDefault()) { } если joomla 3.0 то вместо == используйте !=

<?php
/*
Social jungle плагин социальных закладок.
Версия pro 2013.03.26
Автор Ваня
Copyright (C) 2013 joomla-umnik
Лицензия GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
Официальный сайт http://joomla-umnik.ru
*/


//защита от прямого доступа
defined('_JEXEC') or die;

/*
Класс плагина к чему он пренадлежит в данном случае к группе расширений.
Так же он может принадлежать и к другим группам, к примеру редакторам, или контенту. Тогда нужно указывать
не Extension а Editor и так далее. Так же можно создать и свою отдельную группу.
 */
class plgContentSocialjungle extends JPlugin
{
	//Конструктор класса
	public function __construct(& $subject, $config)
	{
		parent::__construct($subject, $config);
		$this->loadLanguage();
	}

	/*
		А это непосредственно работа самого плагина! 
		Мы описываем функцию которую впоследствии вызовем в нужном нам месте.	
	*/

	//Вывод в начале статьи, функции как читали в статье могут быть своими так и
	//родными событиями onContentAfterDelete, onContentAfterDisplay, onContentAfterSave и.т.д
	//В данном случае мы выводим в начале статьи наш плагин.
	public function onContentBeforeDisplay($context, &$row, &$params, $page=0)
	{
		//Выводим перменную которая получит урл и title нашей страницы.	
		$document = JFactory::getDocument();
		//Список параметров
		$twitter=$this->params->def('twitter', '');
		//Параметр позиция кнопок, посередине, влево, вправо
		$textalign=$this->params->def('textalign', '');
		//Позиция нашего плагина вверху или внизу страницы, или и там и там.

		//Это получение самих параметров
		$pisition=$this->params->def('pisition', '');
		//Проверяем чему равно значение, если 0 то выводим вначале, 
		//если 2 то так же выводим внизу а скрипт ниже имеет такую же структуру
		//За счёт этого плагин можно вывести в 2 местах одновременно.
		if($pisition==0 or $pisition==2){
			//Запрет вывода плагина на главной странице
			$app = JFactory::getApplication();
			$menu = $app->getMenu();
			if ($menu->getActive() == $menu->getDefault()) { }

			else {
				//Запрет вывода плагина в блоге категорий, это нужно для того 
				//что бы плагин не дублировался
				if(JRequest::getVar('view') == ('category')) { }
				else {
					//Декодируем ссылку
					$uri = &JFactory::getURI();
					urlencode($uri);
					$a .= '<div style="text-align:'.$textalign.'; width:100%; height:100%;">';

					if ($twitter==1) {                    
						$a .= '<a rel="nofollow" target="_blank" href="http://twitter.com/share?text='.
						$document->title.'&url='.urlencode($uri).'" >
						<img src="/plugins/content/socialjungle/socialjungle/twitter-24.png" 
						width="24" height="24" alt="Twitter" title="Twitter" class="" />
						</a>'; 
					}
					  
					$a .= '</div">';
					//Вернуть значение, если использовать echo то может получиться так 
					//что значение выведется раньше.	
					return $a;
					
				}
			}
		}
	}

	//Вывод в конце статьи
	public function onContentAfterDisplay($context, &$row, &$params, $page=0)
	{
		$document = JFactory::getDocument();
			//Список параметров
			$twitter=$this->params->def('twitter', '');
			$textalign=$this->params->def('textalign', '');
			$pisition=$this->params->def('pisition', '');

			if($pisition==1 or $pisition==2){
			$app = JFactory::getApplication();
			$menu = $app->getMenu();
			if ($menu->getActive() == $menu->getDefault()) {}

			else{

				if(JRequest::getVar('view') == ('category')) { }
				else {
					//Декодируем ссылку
					$uri = &JFactory::getURI();
					urlencode($uri);
					$a .= '<div style="text-align:'.$textalign.'; width:100%; height:100%;">';

					if ($twitter==1) {                    
							$a .= '<a rel="nofollow" target="_blank" href="http://twitter.com/share?text='.
							$document->title.'&url='.urlencode($uri).'" >
							<img src="/plugins/content/socialjungle/socialjungle/twitter-24.png" 
							width="24" height="24" alt="Twitter" title="Twitter" class="" />
							</a>'; 
						}
					  
					$a .= '</div">';
						
					return $a;
					
				}
			}
		}
	}



}

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

Языковой файл ru-RU.plg_content_socialjungle.ini

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

PLG_EXTENSION_SOCIALJUNGLE_TWITTER_ON="Опубликовано"
PLG_EXTENSION_SOCIALJUNGLE_TWITTER_OF="Не опубликовано"
PLG_EXTENSION_SOCIALJUNGLE_TWITTER="Twitter"
PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN="Расположение кнопок"
PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_LEFT="Слева"
PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_CENTER="Центр"
PLG_EXTENSION_SOCIALJUNGLE_TEXTALIGN_RIGHT="Справа"
PLG_EXTENSION_SOCIALJUNGLE_POSITION="Позиция"
PLG_EXTENSION_SOCIALJUNGLE_POSITION_ONE="В начале статьи"
PLG_EXTENSION_SOCIALJUNGLE_POSITION_TWO="В конце статьи"
PLG_EXTENSION_SOCIALJUNGLE_POSITION_THREE="В начале и в конце"

Осталось добавить картинку соц закладки из архива, запаковать и всё готово.

Напоследок

Итак мой дорогой друг! Я верю тебе что ты возможно с первого раза не допёр, причины тому разные: первый раз столкнулся с этим, возникло много вопросов как сделать вызов плагина по коду, просто не врубился. Но в данной статье даны базовые принципы работы плагина, всё остальное можно выдернуть из родных плагинов или же посмотреть оф сайт joomla поверь там много полезного. Иначе если тебя загрузить лишней инфой ты можешь запутаться.
Посмотрите изучите код ещё раз. Его можно как угодно переделать и не обязательно придерживаться родного кода joomla.
Ниже прилагаю архив с плагином.