Как обработать хук движка

Каждое событие инициированное хуком MG::createHook() мы можем перехватить с помощью функции MG::addAction() в файлах плагинов и файле functions.php

Пример обработки хука без параметров:

Давайте в файле пользовательских функций шаблона functions.php напишем функцию

function startEngine(){ echo 'Произошло событие mg_start'; }

А следом назначим ее в качестве обработчика хука mg_start иницируемого в файле mg-core/mg-start.php при запуске движка.

Хук mg_start инициирован следующим способом: MG::createHook('mg_start');  и не находится в теле функции, поэтому передаваемых данных для него не существет и назначить обрабочтик можно без указания дополнительных параметров:

MG::addAction('mg_start''startEngine');

Теперь при обновлении страницы сайта мы будем видеть надпись 'Произошло событие mg_start' выведенную в результате работы пользовательской функции startEngine().

Пример обработки хука с параметрами: 

Попробуем обработать событие models_order_updateorder созданное в методе updateOrder() класса Models_Order таким образом:

return MG::createHook( __CLASS__ ."_"__FUNCTION__$result, func_get_args());

Для обработки хука подобного вида нам потребуется функция принимающая массив исходных данных из метода updateOrder(), а также результат его работы.

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

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

Функция обработчик обязательно должна:

  • возвращать какой-то результат;
  • иметь единственный входящий параметр $arg.  

В параметре $arg всегда будет содержаться массив:

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

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

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

<?php 
MG::addAction('models_order_updateorder','userFunction',1,20);
?>
  • models_order_updateorder – название хука метода updateOrder() класса Models_Order;
  • userFunction — пользовательская функция-обработчик;
  • 1 - единица переданная третьим параметром, указывает на то, что в функцию userFunction нужно передать результат работы updateOrder() и исходные аргументы;
  • 20 - последний параметр, определяет приоритетность выполнения обработчика, другими словами назначает номер очереди. Поскольку для одного хука может существовать неограниченное количество обработчиков, то возникает потребность в использовании приоритетов их выполнения. Данный параметр не обязательный и по умолчанию имеет значение 10.

Внимание!
Названия хуков методов формируются из названия класса и названия метода в нижнем регистре, объединенных через символом нижнего подчеркивания _ : models_order_updateorder, category_addcategory, mg_getbuffer, models_catalog_getlist и т.п.