You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vtiger CRM自定义模块创建记录时自动生成日历事件求助

问题排查与修正方案

原代码核心问题

  • 未获取当前自定义模块记录的「下次拜访」字段值,硬编码固定日期,无法实现动态关联
  • 未关联当前自定义模块记录到Events事件,导致事件无法溯源,且可能不符合Vtiger逻辑要求
  • Events模块必填字段缺失(比如time_start,Vtiger的Events必须配置开始时间才能正常显示在日历中)
  • 未将代码挂载到自定义模块的保存后钩子上,原process方法没有被正确触发执行

修正后的完整代码示例

假设你的自定义模块名为CustomModule,「下次拜访」字段的数据库字段名为next_visit_date,以下是适配后的代码:

<?php
class CustomModule_Save_Action extends Vtiger_Save_Action {
    public function process(Vtiger_Request $request) {
        // 先执行原生保存逻辑,确保自定义模块记录先被保存
        parent::process($request);
        
        $recordId = $request->get('record');
        if (!$recordId) {
            return; // 新建记录时record值为空,需先完成保存再获取
        }
        
        // 拉取当前自定义模块的记录模型
        $customRecordModel = Vtiger_Record_Model::getInstanceById($recordId, 'CustomModule');
        $nextVisitDate = $customRecordModel->get('next_visit_date');
        
        // 若下次拜访日期为空,跳过事件创建
        if (empty($nextVisitDate)) {
            return;
        }
        
        try {
            $this->saveAppointmentRecord($nextVisitDate, $customRecordModel);
        } catch (Exception $e) {
            // 记录错误日志,方便后续排查
            Vtiger_Logger::log("自动创建Events事件失败: " . $e->getMessage(), 'ERROR');
        }
    }

    public function saveAppointmentRecord($nextVisitDate, $customRecordModel) {
        $linkModule = "Events";
        $recordModel1 = Vtiger_Record_Model::getCleanInstance($linkModule);
        
        // 设置事件主题,关联原记录信息
        $recordModel1->set('subject', "客户拜访:" . $customRecordModel->get('subject'));
        
        // 关联负责人(沿用自定义模块的负责人,避免硬编码ID导致权限问题)
        $recordModel1->set('assigned_user_id', $customRecordModel->get('assigned_user_id'));
        // 关联mentor和apprentice,从原记录拉取对应字段值
        $recordModel1->set('mentorid', $customRecordModel->get('mentorid'));
        $recordModel1->set('apprenticeid', $customRecordModel->get('apprenticeid'));
        
        // 设置事件的起止时间(默认当天9点到10点,可根据需求调整)
        $startTime = $nextVisitDate . " 09:00:00";
        $endTime = $nextVisitDate . " 10:00:00";
        $recordModel1->set('date_start', $nextVisitDate);
        $recordModel1->set('time_start', $startTime);
        $recordModel1->set('due_date', $nextVisitDate);
        $recordModel1->set('time_end', $endTime);
        
        // 设置事件状态与类型,确保日历正常显示
        $recordModel1->set('eventstatus', 'Planned');
        $recordModel1->set('activitytype', 'Meeting'); // 可选Call,根据业务需求选择
        
        // 关联原自定义模块记录(可选但推荐,方便从事件回溯到原记录)
        $recordModel1->set('linkto', 'CustomModule');
        $recordModel1->set('linktoid', $customRecordModel->getId());
        
        $recordModel1->set('mode', 'create');
        $recordModel1->save();
        
        return $recordModel1;
    }
}

关键配置步骤

  1. 挂载钩子:将上述代码保存为modules/CustomModule/actions/Save.php,替换CustomModule为你的实际模块名,这样保存自定义模块记录时会自动触发该逻辑。
  2. 字段验证:在Vtiger后台的「模块管理->字段管理」中,确认「下次拜访」字段的数据库字段名与代码中next_visit_date一致。
  3. 必填字段检查:根据你的Vtiger版本,确认Events模块的必填字段(比如assigned_user_id为必填项,硬编码ID可能导致权限错误)。
  4. 日志排查:若仍未生效,查看Vtiger日志文件storage/logs/vtigercrm.log,根据错误信息定位问题。

验证要点

  • 保存自定义模块记录后,检查Events模块是否生成对应事件
  • 打开日历模块,确认事件是否按「下次拜访」日期正确显示
  • 查看事件详情,确认关联的用户、原记录信息是否正确

内容的提问来源于stack exchange,提问作者Mart-ASE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:55