Механизм "хуков"

Механизм "хуков"

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

Механизм хуков позволяет модулям реагировать на определенные события или выводить содержимое в фронт или бэк офисе. Таким образом хуки можно разделить на:

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

Иногда визуальный хук можно использовать также в качестве обработчика события (например фиксировать заход на главную страницу с помощью обработки хука «home»). При этом модуль не обязан возвращать какое-либо визуальное содержимое.

В стандартной теме PrestaShop для главной страницы можно выделить следующие визуальные хуки:

  • header - класс FrontController
  • top - класс FrontController
  • leftColumn - класс FrontController
  • home - контроллер IndexController
  • rightColumn - класс FrontController
  • footer - класс FrontController

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

Использование хуков

Прежде всего для правильного использования хуков в классе нашего модуля нужно создать не статический public метод, название которого начинается с ключегового слова «hook» и имени спользуемого хука (например для хука «home» метод будет выглядеть как «hookHome»). В созданный метод передается только один аргумент - массив различных параметров, зависящих от хука.

public function hookNameOfHook($params)
{
	//...
}

Вторым шагом является регистрация модуля в хуке. Это можно сделать вручную на вкладке Модули/Позиции, либо при установке модуля выполнить автоматическую регистрацию.

public function install()
{
	return parent::install() && $this->registerHook('NameOfHook');
}

При удалении модуля нет необходимости в удалении регистрации в хуке, PrestaShop очистит информацию об этом самостоятельно.

Также можно использовать чужие хуки в собственном модуле. Это можно сделать вызвав функцию hookExec.

$params = array( 
	'param_1' => 'value_1' , 
	'param_2' => 'value_2' , 
	); 
Module :: hookExec ( 'NameOfHook' , $params );

Добавление нового хука

Для начала новый хук нужно добавить в таблицу хуков. Сделать это можно двумя способами. Добавлением при помощи класса Hook:

$hook = new Hook();
$hook->name = 'NameOfHook';
$hook->add();

Либо прямой записью в базу данных (более гибкий способ):

INSERT INTO `ps_hook` (`name`, `title`, `description`, `live_edit`) 
	VALUES ('nameOfHook', 'Name Of Hook', 'It is a custom hook !', 1);

Затем добавим в контроллер или класс вызов созданного нами хука. Например для создания визуального хука, действующего во всем фронт-оффисе переопределим класс FrontController следующим образом:

<?php
class FrontController extends FrontControllerCore
{
	public function displayHeader()
	{
		self::$smarty->assign('HOOK_NameOfHook', Module::hookExec('NameOfHook'));
		parent::displayHeader();
	}
}

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

mexanizm-xukov.txt · Последние изменения: 2015/12/27 16:22 (внешнее изменение)