【问题标题】:Field validations in sugarcrmSugarCRM 中的现场验证
【发布时间】:2013-10-04 14:38:25
【问题描述】:

我刚开始第一次使用 SugarCRM CE(版本 6.5.15 (Build 1083))。添加新字段或模块时的易用性给我留下了深刻的印象,但似乎缺少一件非常不可或缺的事情:验证用户输入。

例如,我想检查很多东西:

  • 使用一些正则表达式检查电子邮件地址的格式是否有效
  • 检查邮政编码是否存在(可能调用 webswervice 进行验证)
  • 计算一下市民​​服务号是否有效

我似乎能够在工作室中做的唯一一件事就是使字段成为必填项,似乎没有任何标准方法可以对字段执行验证。

当我用谷歌搜索时,我能找到的只有很多破解源代码的方法,比如这个:http://phpbugs.wordpress.com/2010/01/22/sugarcrm-adding-javascript-validation-on-form-submit/ 即便如此,我也找不到任何实际进行验证的示例。

我只是错过了什么吗?还是编辑源代码是添加它的唯一方法?

【问题讨论】:

    标签: sugarcrm


    【解决方案1】:

    我认为 CE 版本中不提供“标准”验证。

    令我惊讶的是,您无法在某处定义验证并将其附加到字段。我有点预料到这一点,因为系统的其余部分结构非常好(模块、包等)

    例如,我现在创建了一张 11 支票,这是一张针对荷兰银行帐号的非常具体的支票。为了让它工作,我做了以下事情(基于我在谷歌上搜索的例子):

    我将银行帐户添加到工作室中的联系人,然后编辑 \custom\modules\Contacts\metadata\editviewdefs.php

    我添加了以下sn-ps:

    'includes'=> array(
            array('file'=>'custom/modules/Contacts/customJavascript.js')),
    
    
    
    
    array (
             0 =>
              array(
               'customCode' =>
                '<input title="Save [Alt+S]" accessKey="S" onclick="this.form.action.value=\'Save\'; return check_custom_data();" type="submit" name="button" value="'.$GLOBALS['app_strings']['LBL_SAVE_BUTTON_LABEL']>',
              ),
             1 =>
              array(
               'customCode' =>
                '<input title="Cancel [Alt+X]" accessKey="X" onclick="this.form.action.value=\'index\'; this.form.module.value=\''.$module_name.'\'; this.form.record.value=\'\';" type="submit" name="button" value="'.$GLOBALS['app_strings']['LBL_CANCEL_BUTTON_LABEL'].'">'
              )
            ),
    

    我在 customJavascript.js 中放置了这段代码:

    function check_custom_data()
    {
        if (!eleven_check(document.getElementById("bankaccount_c").value)){
            alert ('Bank account not valid');
            return false;
        } else {
          return check_form('EditView');
        }
    
        function eleven_check(bankaccount) {
        bankaccount=bankaccount.replace(/\D/, "");
        charcount=bankaccount.length;
        var som=0;
        for (i=1; i<10; i++) {
            getal=bankaccount.charAt(i-1);
            som+=getal*(10-i);
        } 
        if (som % 11==0 && charcount==9) {
            return true
        } else {
            return false
        }
    }
    
    }
    

    此检查现在按我希望的方式工作,但我想知道这是否是添加验证的最佳方式。然而,这种添加验证的方式并不适合 PHP 验证,例如,如果我出于某种原因想要针对数据库中的某些数据进行验证,则必须使用 ajax 调用来完成。

    【讨论】:

    • 您可以使用 add_error_style() 函数使用 Sugar 标准通知,而不是“警报”。首先调用clear_all_errors();清除所有表单错误,然后调用函数查看字段上的错误:add_error_style('EditView', 'bankaccount_c','Bank account not valid' );
    【解决方案2】:

    电子邮件验证在专业版中,我认为它也在 CE 中,但我不是 100% 确定。 其他 2 个更具体 - 邮政编码验证将取决于您所在的国家/地区,因此很难推出。对于这些,您需要编写自己的自定义验证。

    【讨论】:

      【解决方案3】:

      我知道已经晚了,但也许还有人需要这个。

      您可以像这样在 vardefs 中添加自定义 javascript 验证作为回调:

      'validation' => 
      array (
        'type' => 'callback',
        'callback' => 'function(formname,nameIndex){if($("#" + nameIndex).val()!=999){add_error_style(formname,nameIndex,"Only 999 is allowed!"); return false;}; return true;}',
      ),
      

      我在这里记录了它,因为它在其他地方没有很好地记录:

      https://gunnicom.wordpress.com/2015/09/21/suitecrm-sugarcrm-6-5-add-custom-javascript-field-validation/

      【讨论】:

        【解决方案4】:

        您可以将自定义验证代码添加到以下文件:./custom/modules/.../clients/base/views/record/record.js

        您可以在此处添加验证码。在此示例中,我将验证当帐户具有客户类型时 phone_number 是否不为空:

        RECORD.JS 中的示例代码:

        ({
            extendsFrom: 'RecordView',
            initialize: function (options) {
                app.view.invokeParent(this, {type: 'view', name: 'record', method: 'initialize', args:[options]});
        
                //add validation
                this.model.addValidationTask('check_account_type', _.bind(this._doValidateCheckType, this));
            },
            _doValidateCheckType: function(fields, errors, callback) {
                //validate requirements
                if (this.model.get('account_type') == 'Customer' && _.isEmpty(this.model.get('phone_office')))
                {
                    errors['phone_office'] = errors['phone_office'] || {};
                    errors['phone_office'].required = true;
                }
                callback(null, fields, errors);
            }
        })
        

        别忘了修复和重建!

        完整的文档可以在here找到

        【讨论】:

        • 这是用于 SugarCRM 7.x 的,OP 要求使用 6.x CE。
        猜你喜欢
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 2016-04-21
        • 1970-01-01
        • 2015-01-24
        • 2011-08-02
        相关资源
        最近更新 更多