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

文章目录

    昨天看了一天 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 中的代码处理不当,报了异常,那么新增的联系人记录也会保存失败。

    需要慎重。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式