SuiteCRM 二次开发:创建 logic hook 实现自定义逻辑

更新日期: 2024-03-22 阅读次数: 374 字数: 783 分类: 管理

昨天看了一天 SuiteCRM logic hook 的资料,并搜索了 github 上能搜到的所有代码。

但是,感觉效果并不好,公开出来的代码太少,只能零散的学到一些小技巧。

于是,我决定直接在测试环境中通过调试来摸索一番。

修改 logic_hooks.php

例如,我想在客户新关联一个联系人时,自动触发一段 logic hook 逻辑代码。

那么,我需要进入到目录

custom/modules/Contacts

打开 logic_hooks.php, 在最后添加上自己定义的逻辑,修改完后,如下:

<?php
// Do not store anything in this file that is not part of the array or the hook version.  This file will
// be automatically rebuilt in the future.
 $hook_version = 1;
$hook_array = Array();
// position, file, function
$hook_array['before_save'] = Array();
$hook_array['before_save'][] = Array(1, 'Contacts push feed', 'modules/Contacts/SugarFeeds/ContactFeed.php','ContactFeed', 'pushFeed');
$hook_array['before_save'][] = Array(77, 'updateGeocodeInfo', 'modules/Contacts/ContactsJjwg_MapsLogicHook.php','ContactsJjwg_MapsLogicHook', 'updateGeocodeInfo');
$hook_array['after_save'] = Array();
$hook_array['after_save'][] = Array(1, 'Update Portal', 'modules/Contacts/updatePortal.php','updatePortal', 'updateUser');
$hook_array['after_save'][] = Array(77, 'updateRelatedMeetingsGeocodeInfo', 'modules/Contacts/ContactsJjwg_MapsLogicHook.php','ContactsJjwg_MapsLogicHook', 'updateRelatedMeetingsGeocodeInfo');


// 下面是我添加的自定义逻辑
$hook_array['after_relationship_add'] = Array();
$hook_array['after_relationship_add'][] = array(
    99,  // sort order
    'UpdatePaymentSum',  // hook label
    'custom/modules/Contacts/UpdatePaymentSum.php',   // hook file
    'UpdatePaymentSum',  // hook class
    'updatePayment'      // hook method
);
?>

新建 PHP 文件

例如指定的 hook 文件在当前目录,就需要在当前目录下新建

UpdatePaymentSum.php

测试代码如下:

<?php

class UpdatePaymentSum
{
    public function updatePayment($bean, $event, $arguments)
    {
        $GLOBALS['log']->fatal('event: ' . $event);
    }
}

即,只打印一段日志。

修改文件权限

例如,对于新增的 hook 文件 UpdatePaymentSum.php。需要确保文件权限:

sudo chown www-data:www-data UpdatePaymentSum.php
sudo chmod +x UpdatePaymentSum.php

确认:

$ ls -lah
total 20K
drwxrws---  3 www-data www-data 4.0K Mar 22 10:48 .
drwxrwxr-x 16 www-data www-data 4.0K Mar 22 10:46 ..
drwxrws---  3 www-data www-data 4.0K Mar 22 09:35 Ext
-rwxr-xr-x  1 www-data www-data 1.3K Mar 22 10:45 logic_hooks.php
-rwxr-xr-x  1 www-data www-data  794 Mar 22 10:48 UpdatePaymentSum.php

quick repair and rebuild

在部署了新的 logic hook 之后,需要使用管理员账号在系统管理 - 修复 - 执行 quick repair and rebuild (快速修复和重建)。

修复并重建数据库、扩展组件、字段定义文件、 组件等。

但是这个功能描述太吓人了。。。为啥是重建数据库呢?

应该是描述问题。

之前只在安装 SuiteCRM 中文语言包时,使用过此功能。参考: SuiteCRM 中文翻译语言包安装

但是也没有发现数据库的数据被清空,因为 admin 账号依然可以登录哇。

通过日志确认 logic hook 生效

执行完 quick repair and rebuild 之后,在具体的客户页面添加一个联系人之后,就能在项目根目录的 suitecrm.log 日志文件中看到调试日志了。如:

Fri Mar 22 10:47:41 2024 [1034040][1][FATAL] event: after_relationship_add

是否每次修改都需要执行 quick repair and rebuild

并不是这样的。

只要当前 logic hook 已经注册过了,那么之后,对当前 hook 的代码修改,并不需要再次执行 quick repair and rebuild。

风险警告

如果 logic hook 中的代码处理不当,报了异常,那么新增的联系人记录也会保存失败。

需要慎重。

tags: CRM

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式