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; } }
关键配置步骤
- 挂载钩子:将上述代码保存为
modules/CustomModule/actions/Save.php,替换CustomModule为你的实际模块名,这样保存自定义模块记录时会自动触发该逻辑。 - 字段验证:在Vtiger后台的「模块管理->字段管理」中,确认「下次拜访」字段的数据库字段名与代码中
next_visit_date一致。 - 必填字段检查:根据你的Vtiger版本,确认Events模块的必填字段(比如
assigned_user_id为必填项,硬编码ID可能导致权限错误)。 - 日志排查:若仍未生效,查看Vtiger日志文件
storage/logs/vtigercrm.log,根据错误信息定位问题。
验证要点
- 保存自定义模块记录后,检查Events模块是否生成对应事件
- 打开日历模块,确认事件是否按「下次拜访」日期正确显示
- 查看事件详情,确认关联的用户、原记录信息是否正确
内容的提问来源于stack exchange,提问作者Mart-ASE
相关产品推荐
相关产品推荐

