Расширение логики модулей или Logic Hooks. Часть 1

Обдумывая, что бы написать для следующей статьи, я подумал, что ничего еще не было ничего написано про расширение логики стандартных модулей в SugarCRM. Так, сама собой возникла следующая тема: Logic Hooks (на русском языке не звучит дословный перевод «логический хук/крюк», поэтому в дальнейшем ограничимся коротким русским вариантом: хук).

В платных версиях SugarCRM есть так называемый workflow, модуль, через который можно производить уведомления о достижении какого-то события (например: отказ от сделки). Так как бесплатная CRM не имеет данного модуля, то и уведомления придется тоже осуществлять через данные «хуки».

Logic Hooks позволяет добавлять функционал к основным функциям класса Bean (таким, например, как перед сохранением, перед удалением и т.д) в upgrade safe стиле. Напомним, что upgrade safe — это неизменяемый при обновлении CRM системы кастомный код. То есть, написав такую логику, вам не надо заботиться о том, что же случится с вашими логическими связями после обновления SugarCRM до какой-нибудь новой версии. Достигается это тем, что ваш «хук» код отделяется от основного CRM кода.

Код объявления Logic Hook должен находиться по пути custom/modules/Название_модуля/logic_hooks.php. Если отсутствует какая-либо из папок по данному пути, создайте ее, как и сам файл.

Например: custom/modules/Opportunities/logic_hooks.php -определение хуков для модуля сделок.

Пример содержимого файла:

<?php
$hook_version = 1;
$hook_array = Array();
$hook_array['before_save'] = Array();
$hook_array['before_save'][] = Array(10, 'Проверяем статус заказа, и если надо завершаем выполнение на бирже', 'custom/Extension/modules/Opportunities/Ext/CustomLogicHook.php','OpportunityCustomLogicHook', 'checkOpportunityClosedFailed');
$hook_array['after_save'] = Array();
$hook_array['after_save'][] = Array(101, 'Проверка и добавление авто связи с контактом', 'custom/Extension/modules/Opportunities/Ext/CustomLogicHook.php','OpportunityCustomLogicHook', 'afterSaveRelationshipToContact');
$hook_array['after_delete'] = Array();
$hook_array['after_delete'][] = Array(98, 'Удаляем запись из финансов', 'custom/Extension/modules/Opportunities/Ext/CustomLogicHook.php','OpportunityCustomLogicHook', 'afterDeleteFinanceDelete');
?>

Теперь объясним содержание данного файла.

Переменная $hook_version = 1; — Версия хука, пока доступна только первая.

Двумерный массив $hook_array, где ключом является название события на которое «вешается» наш logic hook, а значение – массив, содержащий необходимые для запуска хука параметры в следующем порядке:

1. Приоритет выполнения хука. Хук с наименьшим значением выполняется первее.

2. Имя / Описание хука. Нигде не используется, так что называйте как вам угодно, лишь бы вы потом позже могли вспомнить, что делает этот хук.

3. Путь к файлу с вашим хуком. Желательно располагать данный файл тоже в папке custom того же модуля, чтобы вам было ясно, к какому модулю этот хук относится. Мне удобнее располагать данные файлы в папке
custom/Extension/modules/<Название_модуля>.

4. Имя класса вашего logic hook.

5. Имя функции в классе logic hook.

Мы еще не разобрали возможные ключи массива хуков, которые соответствуют событиям Bean класса в CRM, к которым мы «цепляем» наш функционал. А их довольно много и делятся они на 3 типа:

1) Application hooks (Хуки приложения).
Особенность этих хуков в том, что они не используют bean класс в качестве аргумента. Проще говоря, не работают с текущим bean классом, а позволяют прицепить общий для всей CRM системы функционал. Например, вам необходимо добавить javascript на все страницы — это самый простой пример использования таких хуков.

Варианты application hooks:

  • after_ui_frame

Вызывается после того, как сформировался основной фрейм страницы, до того, как отобразился footer страницы.

  • after_ui_footer

После формирования основного фрейма страницы и после того как сформировался footer.

  • server_round_trip

Вызывается в конце каждой страницы.

2) Module hooks (Хуки модулей).
Самые распространенные хуки. Связаны с текущим bean классом SugarCRM. И в качестве аргумента в функцию передается ссылка на bean класс. В результате чего можно легко изменить текущий класс, проверить текущие значения, изменить эти значения, вызвать оповещение и т. д.

Варианты module hooks:

  • before_delete

Вызывается перед удалением записи

  • after_delete

Вызывается после удаления записи

  • before_restore

Вызывается перед восстановлением ранее удаленной записи

  • after_restore

Вызывается после восстановления удаленной записи

  • after_retrieve

Вызывается после извлечения записи из БД. Не вызывается при создании новой записи

  • before_save

Вызывается перед сохранением записи

  • after_save

После сохранения записи в БД

  • process_record

Вызывается после составления запроса к БД на извлечение записи. Это дает возможность разработчику посмотреть и протестировать автоматически составленный запрос. Это также хороший хук для установки значений полей в форме списка и просмотра, он не вызывается при формировании формы редактирования.

3) Hooks for Users module (Хуки для модуля пользователей)
Варианты данных хуков:

  • before_logout

Вызывается перед логаутом пользователя

  • after_logout

Вызывается после логаута пользователя

  • after_login

Вызывается после успешной авторизации пользователя и входа в систему

  • login_failed

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

Сегодня мы рассмотрели теорию logic hook в SugarCRM. В следующей части мы изучим несколько практических примеров использования, после которых, я думаю, у вас уже не останется каких либо вопросов или неясностей.

Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.

Есть 5 коммент. к “Расширение логики модулей или Logic Hooks. Часть 1”

  1. Igor:

    В 6й версии Sugar есть еще два события:

    — after_relationship_add

    — after_relationship_delete

  2. ecoatoms:

    Варианты application hooks:

    after_ui_frame

    Вызывается после того, как сформировался основной фрейм страницы, до того, как отобразился footer страницы.

    after_ui_frame

    После формирования основного фрейма страницы и после того как сформировался footer.

    Тут опечатка. Два повторяющихся ключа массива.

    Наверное нужно изменить второй на after_ui_footer.

  3. kir:

    Спасибо за полезную статью.

    Правда из-за неточностей описания хуков пришлось помучиться :)

    Мне надо было вычислять значение сумм оплат и отгрузок (связанные модули) для сделки и выводить их на DetailView сделки и ListView сделок.

    Воспользовался описанием хуков

    after_retrieve — написано, что вызывается ДО извлечения записи из БД.

    На самом деле вызывается не до, а после извлечения записи из БД (что собственно следует из названия).

    Удобно использовать на DetailView для полей с вычислениями, например.

    до извлечения записи из БД работает before_retrieve, который здесь пропущен.

    process_record

    по моему опыту — почему-то не срабатывает в форме просмотра DetailView.

    Использовать удобно для ListView — там как по маслу.

Написать комментарий

Вы должны войти чтобы комментировать.