Vesthelm Engine

2.1.4 Руководство пользователя

Класс Хуки

Хуки позволяет динамически изменять или добавлять функциональность без изменения основных файлов 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(), для передачи всех переменных). Переменные использует хук контроллер, динамическому хуку это не нужно.