Обдумывая, что бы написать для следующей статьи, я подумал, что ничего еще не было ничего написано про расширение логики стандартных модулей в 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. В следующей части мы изучим несколько практических примеров использования, после которых, я думаю, у вас уже не останется каких либо вопросов или неясностей.
Высказать своё мнение о статье Вы можете в комментариях, если Вас интересуют какие либо вопросы или дополнения, то обсуждение по данной теме доступно на нашем форуме.
В 6й версии Sugar есть еще два события:
— after_relationship_add
— after_relationship_delete
Спасибо. Этот момент упустил. Обязательно добавлю в статью.
Тут опечатка. Два повторяющихся ключа массива.
Наверное нужно изменить второй на after_ui_footer.
Совершенно верно. Спасибо, исправлено.
Спасибо за полезную статью.
Правда из-за неточностей описания хуков пришлось помучиться
Мне надо было вычислять значение сумм оплат и отгрузок (связанные модули) для сделки и выводить их на DetailView сделки и ListView сделок.
Воспользовался описанием хуков
after_retrieve — написано, что вызывается ДО извлечения записи из БД.
На самом деле вызывается не до, а после извлечения записи из БД (что собственно следует из названия).
Удобно использовать на DetailView для полей с вычислениями, например.
до извлечения записи из БД работает before_retrieve, который здесь пропущен.
process_record
по моему опыту — почему-то не срабатывает в форме просмотра DetailView.
Использовать удобно для ListView — там как по маслу.