PHPShop
Search
K
Comment on page

Создание дизайн-хуков - правка API через файлы дизайна

Дизайн Хук (Design Hook) - это PHP функция, которая перехватывает на себя выполнение заводских функций PHPShop API, дающая возможность "на лету" перехватывать данные и видоизменять их вывод, добавлять новые возможности, управлять настройками API.
"Дизайн Хуки" отличаются от "Хуков" параметром запуска и расположения. Дизайн Хуки в отличие от Хуков распространяются вместе с шаблоном дизайна и выполняют роль корректора вывода информации под формат дизайна (изменение вывода сетки товаров, списка каталогов, цвет облака тегов и т.д.). Дизайн Хуки активируются автоматически при выборе шаблона, их содержащего. При смене шаблона Дизайн Хуки отключаются. Это дает возможность дизайнерам отдавать заказчику готовый дизайн шаблон с тонкой настройкой параметров вывода без вмешательства в заводские файлы API. Так как при обновлении шаблоны не могут быть заменены, то Дизайн Хуки не затираются при обновлении платформы.

Позиционировании активации в функции

Возможностью использования хука обладают 90% функций PHPShop. В таких функциях (методы классов) предусмотрено до 3 режимов включение хука (START, MIDDLE и END).

Хук может быть активирован

  1. 1.
    В начале функции - для активации использовать параметр роутера хука START
  2. 2.
    В середине функции - для активации использовать параметр роутера хука MIDDLE
  3. 3.
    В конце функции - для активации использовать параметр роутера хука END
Для определения размерности роутера смотрите справочную информацию по функциям. Использование роутера хука позволяет более точно подсоединяться к функциям и экономить ресурсы проекта на исключении повторяющихся элементах кода и зеркальных запросах к БД.

Использование роутера

Роутер позволяет координировать место активации хука. Чтобы не переписывать весь код функции для перехвата выборки из БД используется роутер MIDDLE, для полного перехвата функции в самом начале и отключение параллельного выполнения перехватываемой функции используется роутер START. Для модернизации результата итогового выполнения функции используется роутер END.
Пример использования роутера
/**
* Изменение сетки сопутствующих товаров, сетка товаров = 3
*/
function odnotip_hook($obj,$row,$rout) {
if($rout=='START') {
$obj->odnotip_setka_num=3;
$obj->line=true;
}
}
Прерывание функции
Для полного перехвата дальнейшего выполнения функции, в самой функции должно быть условие прерывания (см. описание функций) и хук должен выдавать булевого значение true результатом выполнения.
/**
* Изменение сетки сопутствующих товаров, сетка товаров = 3
*/
function odnotip_hook($obj,$row,$rout) {
if($rout=='START') {
$obj->odnotip_setka_num=3;
$obj->line=true;
return true;
}
}

Сравнение возможностей дизайн-хуков и хуков

Design Hook

  1. 1.
    Перехват функций API внешней части
  2. 2.
    Автоматическая активация
  3. 3.
    Защита от изменений при обновлении
  4. 4.
    Размещение в /phpshop/templates/имя шаблона/php

Hook

  1. 1.
    Перехват функций API внешней части
  2. 2.
    Перехват функций API административной части
  3. 3.
    Поддержка режима инсталляции (включение/выключение)
  4. 4.
    Поддержка персональной БД для настроек
  5. 5.
    Защита от изменений при обновлении при условии уникальности имени модуля
  6. 6.
    Размещение в /phpshop/modules/имя модуля

Создание Design Hook

В шаблонах заложены ознакомительные дизайн хуки, некоторые из которых используются для коррекции вывода под шаблоны. Более полный список дизайн хуков представлен в модуле "Example". Для создания дизайн хука требуется создать папку php в шаблоне /phpshop/templates/имя шаблона/php.

Структура дизайн хука

  1. 1.
    inc/config.ini - конфигурации карты перехвата функций
  2. 2.
    element/ - новые элементы дизайна
  3. 3.
    hook/ - дизайн хуки

Конфигурация

Картой конфигурации дизайн-хуков служит файл config.ini в папке с хуком.
[hook]
phpshopshop="php/hook/cell.hook.php";
phpshopproductindexelements="php/hook/index.hook.php";
phpshopshopcatalogelement="php/hook/index.hook.php";
phpshopsearch="php/hook/search.hook.php";
phpshopcloudelement="php/hook/cloud.hook.php";
phpshopspec="php/hook/spec.hook.php";
phpshopnewtip="php/hook/spec.hook.php";
phpshopnewprice="php/hook/spec.hook.php";
[autoload]
addtoindextemplate="php/element/index.inc.php";
Секция [hook]
В этой секции идет перечисление классов, в которых будут активированы дизайн-хуки. Формат записи: имя класс = "размещение файла дизайн-хука"; Первым параметром идет имя класса, вторым размещение файла дизайн-хука. Первый параметр должен быть уникален, иначе будет выполняться самая последний в очереди. Все хуки должны быть сгруппированы в едином файле по имени класса. Следующая запись будет неверной, так имя класса phpshopshop повторяется:
phpshopshop="php/hook/priceformat.hook.php";
phpshopshop="php/hook/odnotip.hook.php"; # ошибка уникальности имени класса
Секция [autoload]
В этой секции указываются файлы для авто-подключения к шаблону, в данном примере подключается новый элемент случайного товара с изображением в шапке дизайна. Формат записи: уникальный идентификатор = "размещение файла элемента для загрузки";
Состав файла дизайн хука
файлы дизайн хуков размещаются в папке //phpshop/templates/имя шаблона/php/hook/, пример файл cell.hook.php:
/**
* Изменение сетки сопутствующих товаров, сетка товаров = 3
*/
function odnotip_hook($obj,$row,$rout) {
if($rout=='START') {
$obj->odnotip_setka_num=3;
$obj->line=true;
}
}
$addHandler=array
(
'odnotip'=>'odnotip_hook'
);
В файле должен обязательно присутствовать массив карты перехвата функций(методов) $addHandler, формата $addHandler = array('оригинальное имя функции' => 'хук функция в этом файле'); В примере метод phpshopshop->odnotip() будет перехвачен функцией odnotip_hook(). Имя класса phpshopshop было определено в конфигурации config.ini (phpshopshop="php/hook/cell.hook.php";).
Ключи в массиве $addHandler должны быть уникальные, если требуется несколько раз обработать уникальную функцию, то это нужно реализовать все в единой функции хука.
Для создания нового хука нужно знать имя класса и имя метода, в котором будет активирован хук. Информацию по наличию хуков в функциях можно получить в справочной информации.
Аргументы функции хука
Функция хука имеет три аргумента, для определения функции необходим только первый аргумент.
  1. 1.
    $obj - ссылка на объект(класс) перехватываемой функции(метода). $obj передается по ссылке &$obj и с помощью ее можно изменять параметры объекта, например
    function odnotip_hook($obj,$row,$rout) {
    $obj->line=true;
    }
  2. 2.
    $row - массив данных, обычно это результат выборки из БД. $row можно использовать для переопределения переменных шаблонизатора, например
    function odnotip_hook($obj,$row,$rout) {
    $obj->set('productName','Рекомендуем '.$row['name']);
    }
  3. 3.
    $rout - роутер размещения(выполнения). Хук можно использовать в начале, середине и в конце функции, в зависимости от определения самой функции (см. описание функции). Пример:
    function odnotip_hook($obj,$row,$rout) {
    if($rout == 'MIDDLE')
    $obj->set('productName','Рекомендуем '.$row['name']);
    }
    В других местах этой функции хук дублироваться не будет.

Персонализирование шаблона оформления модулей

Существует возможность для каждого шаблона указывать персональные шаблоны оформления модулей для более детального вписывания в общий дизайн. Для изменение шаблона модуля для конкретного шаблона следует скопировать папку /phpshop/modules/имя_модуля/templates в папку требуемого шаблона /phpshop/templates/имя_шаблога/modules/имя_модуля/.

Отладка

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

Рекомендации по созданию хуков

При создании и тестировании нового хука рекомендуется:
  1. 1.
    Отключить из config.ini все остальные хуки, чтобы избежать пересечения хуков.
  2. 2.
    Создавать хук для каждого файла (где идет вызов хука) в отдельные файлы. Это правило позволит избежать ошибки, когда первая функция подгружает файл с хуками удачно, а вторая функция не может подгрузить файл хуков, так как команда include_once(файл хука) не даст повторно загрузить один и тот же файл.
  3. 3.
    Имя функции хука должно быть уникально, лучше использовать длинные имена, поясняющее действие хука.
  4. 4.
    Если в описание возможного места хука используется память событий [[PHPShop Memory]], то хук обязательно должен возвращать true, в противном случаи хук выполнится только 1 раз.
  5. 5.
    Дизайн-хук привязывается строго к дизайну, следует обязательно ставить тестируемый дизайн с хуками как дизайн системы по умолчанию, чтобы избежать запоминания отсутствия хука в памяти "PHPShop Memory".
  6. 6.
    Если дизай-хук полностью игнорирует все правила следует в начало файла дизайн хука поставить любую отладочную информацию (echo 123;) и тд, чтобы убедится, что файл хука вообще загружается в этом месте и не перепутана точка активации хука. Так же рекомендуется вставлять отладочную информацию в саму функцию хука, чтобы убедится, что имя функции для перехвата указано верно. В положительном результате вся отладочная информация будет идти в начале html файла в браузере.
  7. 7.
    Если дизайн-хук использует "PHPShop Memory", то для тестирования следует перегрузить браузер или на момент тестирования поставить опцию $this->memory=false; в свойствах класса, где активируется хук. После тестирования обязательно вернуть свойство $this->memory обратно.

Реализации

В Базе хуков собраны наиболее полезные для интернет-магазина коллекции хуков, позволяющие реализовывать любые персонализации дизайна и логики ПО.
Last modified 3yr ago