自定义字段日期验证 - SuiteCRM 7.10.4/Sugar 6.5.25(Build 344)
解决SuiteCRM中自定义日期字段的前后端验证问题
刚接触SuiteCRM确实会对自定义验证有点摸不着头脑,我给你一套完整的解决方案,包含前端即时验证和后端安全验证,确保万无一失:
一、前端即时验证(用户输入时就提示)
SuiteCRM基于SugarJS,我们可以给end_date_c字段添加自定义验证函数:
- 创建自定义JS文件
在custom/modules/[你的模块名称]/js/目录下新建date_validation.js,写入以下代码:
// 验证结束日期不早于开始日期 function checkEndDate(field, value, form) { const startDateVal = document.getElementById('start_date_c').value; // 只有当两个字段都有值时才验证 if (value && startDateVal) { const startDate = new Date(startDateVal); const endDate = new Date(value); if (endDate < startDate) { return '结束日期不能早于开始日期,请重新选择'; } } return true; }
- 在模块的编辑视图中引入并绑定验证
找到模块的编辑视图配置文件custom/modules/[你的模块名称]/metadata/editviewdefs.php,找到end_date_c字段的配置块,添加验证规则并引入JS:
// 先在视图的js部分添加自定义JS文件 'includes' => array( array('file' => 'custom/modules/[你的模块名称]/js/date_validation.js'), ), // 然后在end_date_c字段配置里添加验证 array ( 'name' => 'end_date_c', 'label' => 'LBL_END_DATE_C', 'type' => 'date', 'validation' => array( 'custom' => array( 'callback' => 'checkEndDate', ), ), ),
二、后端安全验证(防止绕过前端的情况)
前端验证可以被绕过,所以必须加后端逻辑钩子(Logic Hook):
- 创建逻辑钩子配置文件
在custom/modules/[你的模块名称]/目录下新建logic_hooks.php:
<?php $hook_version = 1; $hook_array = Array(); // before_save钩子:保存前验证 $hook_array['before_save'] = Array(); $hook_array['before_save'][] = Array( 1, // 优先级 'Validate End Date Against Start Date', // 钩子描述 'custom/modules/[你的模块名称]/CustomDateValidator.php', // 处理类路径 'CustomDateValidator', // 类名 'validateEndDate', // 方法名 );
- 创建验证类文件
在同目录下新建CustomDateValidator.php:
<?php class CustomDateValidator { public function validateEndDate($bean, $event, $arguments) { // 检查两个字段是否都有值 if (!empty($bean->end_date_c) && !empty($bean->start_date_c)) { // 转换为DateTime对象(SuiteCRM默认日期格式是Y-m-d) $startDate = DateTime::createFromFormat('Y-m-d', $bean->start_date_c); $endDate = DateTime::createFromFormat('Y-m-d', $bean->end_date_c); if ($endDate < $startDate) { // 抛出错误并阻止保存 $GLOBALS['app']->errorMessage('错误:结束日期不能早于开始日期'); $GLOBALS['app']->stopExecution(); } } } }
三、最后一步:部署生效
- 给自定义文件设置正确的权限:
chown -R www-data:www-data custom/modules/[你的模块名称]/ chmod -R 755 custom/modules/[你的模块名称]/
- 登录SuiteCRM后台,进入Admin > Repair > Quick Repair and Rebuild,执行修复。
这样设置后,用户在填写end_date_c时,如果早于start_date_c会立即收到前端提示;就算有人通过API或其他方式绕过前端,后端也会拦截并报错。
内容的提问来源于stack exchange,提问作者jai
相关产品推荐
相关产品推荐

