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

自定义字段日期验证 - SuiteCRM 7.10.4/Sugar 6.5.25(Build 344)

解决SuiteCRM中自定义日期字段的前后端验证问题

刚接触SuiteCRM确实会对自定义验证有点摸不着头脑,我给你一套完整的解决方案,包含前端即时验证和后端安全验证,确保万无一失:

一、前端即时验证(用户输入时就提示)

SuiteCRM基于SugarJS,我们可以给end_date_c字段添加自定义验证函数:

  1. 创建自定义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;
}
  1. 在模块的编辑视图中引入并绑定验证
    找到模块的编辑视图配置文件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):

  1. 创建逻辑钩子配置文件
    在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', // 方法名
);
  1. 创建验证类文件
    在同目录下新建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();
            }
        }
    }
}

三、最后一步:部署生效

  1. 给自定义文件设置正确的权限:
chown -R www-data:www-data custom/modules/[你的模块名称]/
chmod -R 755 custom/modules/[你的模块名称]/
  1. 登录SuiteCRM后台,进入Admin > Repair > Quick Repair and Rebuild,执行修复。

这样设置后,用户在填写end_date_c时,如果早于start_date_c会立即收到前端提示;就算有人通过API或其他方式绕过前端,后端也会拦截并报错。

内容的提问来源于stack exchange,提问作者jai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:29:07