МЕНЮ
Смотреть демо
0

Ваш заказ

Как устроены плагины в Moguta.CMS

Как устроены плагины в Moguta.CMS

В Moguta.CMS внедрена система hook(крючков), позволяющая на любую стандартную функцию движка повесить собственный обработчик, и изменить ее поведение. Для этого функция движка, перед тем как вернуть результат своей работы, должна создать хук, т.е. заявить во всеуслышание о том, что она выполнилась и ищет обработчика, который бы скорректировал ее работу.

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

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

Создание хука

Для создания хуков в Moguta.CMS предусмотрена статическая функция MG::createHook(), которая создает hook (крючок), для пользовательских функций в плагинах.

Задать хук в Moguta.CMS можно несколькими способами:

  1. MG::createHook('userFunction'); - в любом месте программы выполнится пользовательская функция userFunction() из плагина;
  2. MG::createHook('userFunction', $args); - в любом месте программы выполнится пользовательская функция userFunction($args) из плагина с параметрами.
  3. return createHook('thisFunctionInUserEnviroment', $result, $args); - хук прописывается перед

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

Начнем с простого объявления хука MG::createHook('userFunction'), поместить этот вызов можно абсолютно в любое место движка. Для примера попробуем вызвать его в методе getHtmlContent() в файле mg-core/lib/mg.php:

<?php 
public static function getHtmlContent(){ $result DB::query(' SELECT html_content FROM page WHERE url="'.URL::getLastSection().'.html" '); if($html DB::fetchArray($result)){ //создаем хук MG::createHook('getHtmlContent'); return $html['html_content']; } return false; }
?>

Теперь каждый раз при открытии статической страницы, созданной в панели администрирования сайта, у нас будет срабатывать хук с именем getHtmlContent. Это значит, что в этом месте программы мы можем выполнить любую собственную функцию.

Давайте попробуем создать первый простой плагин "Индикатор статических страниц", выводящий сообщение на всех страницах, созданных в админке сайта. Для этого в папке mg-plugins создадим директорию is-static-page, а в ней файл index.php.

Чтобы система распознала пользовательский плагин, он должен отвечать следующим требованиям:

  1. Храниться в папке mg-plugins:
  2. Сама папка с плагином, может иметь любое название, но состоять только из букв в нижнем регистре:
  3. В папке плагина обязательно должен храниться файл index.php:
  4. В файле index.php должно быть соблюдено правило описание плагина: в первом блоковом комментарии должна содержаться мета информация, описывающая плагин.
<?php 
/* Plugin Name: isStaticPage Plugin URI: http://moguta.ru/plugins/HelloWorld/ Description: Плагин для демонстрации функционала. Сообщение , будет выводиться только на всех страницах созданных в панели администрирования. Author: mogutaTeam Version: 1.0 */
?>

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

<?php 
/* Plugin Name: isStaticPage */
?>

Прописав мета-информацию о плагине, можно приступать к созданию обработчика в файле плагина index.php. В нашем случае он может выглядеть вот так:

<?php 
function isStaticPage(){ echo '<span style="color: green">Эту страницу можно редактировать в панели администрирования</span>'; }
?>

Функцию для вывода сообщения сделали, теперь надо дать понять движку MOGUTA.CMS, что именно эту функцию следует выполнить, когда встретится хук с именем 'getHtmlContent'. Делается это командой MG::addAction() вот так:

<?php 
MG
::addAction('getHtmlContent''isStaticPage');
?>

На этом можно считать, что первый плагин для Moguta.CMS готов! И можно пробовать его подключиться в панели Администрирования.

Весь код получившегося, плагина выглядит так:

<?php 
/* Plugin Name: isStaticPage Plugin URI: http://moguta.ru/plugins/HelloWorld/ Description: Плагин для демонстрации функционала. Зеленая надпись HelloWorld, будет выводиться только на страницах созданных в панели администрирования. Author: Avdeev Mark Version: 1.0 */ function isStaticPage(){ echo '<span style="color: green">Эту страницу можно редактировать в панели администрирования</span>'; } MG::addAction('getHtmlContent''isStaticPage');
?>

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

Как задать хук для функции движка

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

<?php 
createHook
('thisFunctionInUserEnviroment'$result$args);
?>

Чтобы сделать функцию движка доступной для редактирования из плагинов, нужно, перед тем как она вернет результат своей работы выполнить все пользовательские функции, с помощью системы хуков этом можно сделать так:

<?php 
// некоторый класс движка Class Some_Class { // метод возвращающий массив, может принимать параметр (int) $id public function getArray($id){ $result = null; if($id>0){ $result = array(1,2,3,4,5); } return MG::createHook( __CLASS__ ."_". __FUNCTION__, $result, func_get_args()); } }
?>

Давайте разберем подробнее метод MG::createHook, который и определяет новый хук в программе. В этом примере он получает следующие параметры:

  1. __CLASS__ ."_". __FUNCTION__ - строковое название хука в нижнем регистре, состоящее из имени класса, и метода в котором он создан. Такой подход поможет быстрее найти исходную функцию в коде движка, и легко использовать другие хуки по этому правилу. В данном примере имеет значение some_class_ getarray Из названия хука легко догадаться, что создается он для метода getarray в классе some_class.
  2. $result - результат работы исходной функции
  3. func_get_args() – массив входящих параметров в исходную функцию, в данном случае равен array( 0 => $id)

Таким образом мы только что создали хук с именем some_class_ getarray, и теперь если появятся пользовательские обработчики для этого хука, то они будут выполнены перед тем как исходный метод вернет результат.

В предыдущем примере мы уже создавали простой обработчик вот такой строкой:

<?php 
MG
::addAction('getHtmlContent''isStaticPage');
?>

Но для обработки хука подобного вида:

<?php 
return MG::createHook__CLASS__ ."_"__FUNCTION__$resultfunc_get_args());
?>

Необходим несколько иной вид определений обработчика.

Как создать сложный обработчик

На самом деле под словом сложный, понимается лишь определенные правила объявления обработчиков. В действительности все очень просто.

<?php 
// пользовательская функция для обработки событий // в параметр $arg будет передан массив с результатом исходной функции и ее вход. // параметрами. function userFunction($arg){ $arg['result'] = array(5,4,3,4,5); return $arg['result']; }
?>

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

Функция обязательно должна возвращать какой-то результат, и обязательно нужно указать единственный параметр $arg , хотя именоваться он может как вам угодно.

Также помните, что в этот параметр будет передан массив:

<?php 
Array ( result 'результат выполнения исходной функции'arg 'массив аргументов переданный в исходную функцию' )
?>

Посмотреть, что передается в параметр $arg всегда можно, например вот так:

<?php 
var_dump
($arg)
?>

или одним из описанных тут способов.

Подготовив пользовательскую функцию нужно назначить ее в качестве обработчика хука:

<?php 
MG
::addAction(' some_class_ getarray ' ' userFunction '120);
?>

Что такое ' some_class_ getarray ' и 'userFunction' думаю ясно, a вот два других параметра стоит объяснить.

Единица, переданная третьим параметром, указывает количество аргументов у пользовательской функции. В случае определения обработчика для сложного хука этот параметр всегда должен быть равен 1.

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

Данный параметр не обязательный, и по умолчанию имеет значение 10.

Еще раз напомню: обработчики хуков задаются в главном файле плагина index.php. Перед добавлением обработчика к хуку необходимо создать функцию, которая и будет работать в момент его вызова.
Дополнительная информация: http://lifeexample.ru/vse-o-moguta-cms/moguta-cms-razrabotka-plagina-skidok.html

Следите за нами в группе ВКонтактe.