Класс Хуки¶
Хуки позволяет динамически изменять или добавлять функциональность без изменения основных файлов Vesthelm Engine.
В Vesthelm Engine есть два типа хуков: хук контроллер и динамический хук
- Хук контроллер -
Использовать когда вам не нужно изменять значения переменных в файле или классе (изменение переменных возможно, если функция вызова хука содержит допустимые для изменения переменные)!!!
Преимущества: легче отладка, не нужно редактировать таблицы базы данных, чтобы изменить код хука - код хука хранится в файле.
Недостатки: меньше функциональных возможностей, чем динамической хук - не может изменить значения переменных - Динамический хук -
Использовать, когда вам нужно изменить значения переменных в файле или классе!!!
Преимущества: не ограниченная функциональность
Недостатки: для изменения кода хука нужно редактировать таблицу базы данных, трудно отлаживать - использует функцию eval() - Вызов хука
Создание хука контроллер¶
Допустим, вы хотите назначить переменную в шаблон доски объявлений. Нужно использовать имя хука AfterRegisterFunctions, которые определен в файле includes/smarty.php
defined('V_IN_FRONTEND') or die('Powered by <a href="http://www.vesthelm.com/">Vesthelm EE</a>');
class Bulletin_Board_AfterRegisterFunctions_Hook extends Vesthelm_Hook_Controller {
public function execute() {
var_dump('Тестирование хука контроллер');
}
public function init() {
$this->_initBulletins();
}
public function assign() {
$this->_assignBulletins();
}
protected function _initBulletins() {
$this->sponsored_bulletins = $this->bulletin_board->Bulletin->getBulletins();
}
protected function _assignBulletins() {
if (!empty($this->sponsored_bulletins)) {
$this->View->assign("sponsored_bulletins", $this->sponsored_bulletins);
}
}
}
И теперь в ваших файлах шаблонов можно использовать переменную $sponsored_bulletins:
{if $sponsored_bulletins}
{foreach from=$sponsored_bulletins item=bulletin name="bulletins"}
{$bulletin.description}
{/foreach}
{/if}
Анатомия хука контроллер¶
Классы хуков контроллеров расположены в каталогах:
//Хуки сайта
example.com/frontend/hooks
example.com/acp/hooks
//Хуки приложений
example.com/applications/{имя_приложения}/frontend/hooks
example.com/applications/{имя_приложения}/acp/hooks
//Хуки дополнений
example.com/addons/{имя_дополнения}/frontend/hooks
example.com/addons/{имя_дополнения}/acp/hooks
Базовый прототип для хука контроллер:
class Enhancement_Name_Hook_Name_Hook extends Vesthelm_Hook_Controller {
public function execute() {
}
}
Enhancement_Name - имя приложения. Имена приложений должны начинаться с заглавной буквы после символа _ подчеркивания.
Hook_Name - имя хука. Имена хуков должны начинаться с заглавной буквы после символа _ подчеркивания.
Имя файла будет таким же, как имя класса (Hook_Name). Например, если ваш класс:
class Bulletin_Board_AfterRegisterFunctions_Hook extends Vesthelm_Hook_Controller {
public function execute() {
}
}
Ваш файл будет:
applications/bulletin_board/acp/hooks/AfterRegisterFunctions.php
Создание динамического хука¶
Динамические хуки используют PHP функцию eval()
Допустим, вы хотите обнулить переменную $enhancements в файле includes/smarty.php. Таким образом, вы будете использовать хук с именем AfterRegisterFunctions и добавить следующий код в таблицу базы данных hooks:
global $enhancements;
$enhancements = null;
Запрос MySQL для добавления хука:
INSERT INTO `{your_table_prefix}_hooks` (`id`, `enh`, `file`, `name`, `value`, `code`, `status`, `enhancement`, `side`, `u_id`, `order`) VALUES
(NULL, '', 'index', 'AfterRegisterFunctions', 'global $enhancements;
$enhancements = null;', 'php', 'active', '', 'frontend', '', 0);
Вызов хука¶
Для вызова хука в файле, где будет запускатся хук, нужно добавить:
call_hook('hookName', 'enhancement_name', 'file_name', $defined_vars = null);
hookName - имя хука.
enhancement_name - имя приложения. (если указано пустое значение, функция попытается использовать константы V_APPLICATION или V_ADDON, и определит находится ли файл в каталоге приложения или дополнения)
file_name имя файла, в котором вы добавляете функцию call_hook(). (если указано пустое значение, функция попытается использовать константу V_REALM и попытается определить имя файла)
$defined_vars - переменные, которые может изменять хук (переменные должны передаватся по ссылке, можно использовать функцию get_defined_vars(), для передачи всех переменных). Переменные использует хук контроллер, динамическому хуку это не нужно.