Sugarcrm 如何确保糖场验证有足够的时间运行

Sugarcrm 如何确保糖场验证有足够的时间运行,sugarcrm,sugarbean,Sugarcrm,Sugarbean,我正在尝试在Opportunity模块中创建一个字段验证,当用户试图将提交阶段从Upper更改或commit back更改为漏斗时,该字段验证将抛出一个错误。当用户试图保存已编辑的opportunity时,record.js中的验证功能将运行。它将所选提交阶段与保存在商机数据库中的提交阶段进行比较。如果选定的提交阶段为漏斗,且保存的提交阶段为上行或提交,则会引发验证错误。抛出验证错误时,应突出显示提交阶段字段,并显示带有错误消息的弹出窗口 record.js中的验证代码如下所示: initial

我正在尝试在Opportunity模块中创建一个字段验证,当用户试图将提交阶段从Upper更改或commit back更改为漏斗时,该字段验证将抛出一个错误。当用户试图保存已编辑的opportunity时,record.js中的验证功能将运行。它将所选提交阶段与保存在商机数据库中的提交阶段进行比较。如果选定的提交阶段为漏斗,且保存的提交阶段为上行或提交,则会引发验证错误。抛出验证错误时,应突出显示提交阶段字段,并显示带有错误消息的弹出窗口

record.js中的验证代码如下所示:

initialize: function (options) {
    this._super('initialize', [options]);
    app.error.errorName2Keys['check_commit_stages'] = 'ERROR_CHECK_COMMIT_STAGES';
    this.model.addValidationTask('check_commit_stages', _.bind(this._doValidateCommitStages, this));
},

_doValidateCommitStages: function(fields, errors, callback) {
    console.log('Validating commit stages in record.js');

    let CommitStageSelected = this.model.get('commit_stage_c');
    let OpportunityId = this.model.get('id');
    let OpportunityBean = app.data.createBean('Opportunities');
    OpportunityBean.set('id', OpportunityId);
    let CommitStageSaved = '';
    OpportunityBean.fetch({success: function(model, data){
            CommitStageSaved = OpportunityBean.get('commit_stage_c');
            console.log('selected commit stage: ' + CommitStageSelected);
            console.log('saved commit stage: ' + CommitStageSaved);

            let SavedStageUpsideOrCommit = 
            ("Upside" == CommitStageSaved || "Commit" == CommitStageSaved);

            if ("Funnel" == CommitStageSelected && SavedStageUpsideOrCommit) {
                errors['commit_stage_c'] = errors['commit_stage_c'] || {};
                errors['commit_stage_c'].check_commit_stages = true;

                app.alert.show('message-id', {
                    level: 'error',
                    messages: 'Commit Stage cannot be changed from Upside or from Commit to Funnel',
                    autoClose: false
                });
            }

            callback(null, fields, errors);
    }});
},
问题在于,验证错误是在商机已保存后引发的。我得到一个成功的弹出窗口说保存,然后我得到一个错误弹出窗口与验证错误消息。提交阶段字段不会突出显示


我猜验证任务运行时间太长,可能是由于OpportunityBean.fetch函数,因此在验证任务有时间抛出错误之前保存记录。有没有办法延迟保存,或者加快从bean获取数据的速度?或者,问题是完全不同的吗?

我认为您也可以尝试这种方法来完成您试图完成的任务

({
extendsFrom: 'OpportunitiesRecordView',

initialize: function (options) {
    this._super('initialize', [options]);
    app.error.errorName2Keys['check_commit_stages'] = 'ERROR_CHECK_COMMIT_STAGES';
    this.model.addValidationTask('check_commit_stages', _.bind(this._doValidateCommitStages, this));
},

_doValidateCommitStages: function(fields, errors, callback) {
    console.log('Validating commit stages in record.js');

    let CommitStageSaved = this.model.getSynced('commit_stage_c');
    let CommitStageSelected = this.model.get('commit_stage_c');

    console.log('selected commit stage: ' + CommitStageSelected);
    console.log('saved commit stage: ' + CommitStageSaved);

    let SavedStageUpsideOrCommit = 
    ("Upside" == CommitStageSaved || "Commit" == CommitStageSaved);

    if ("Funnel" == CommitStageSelected && SavedStageUpsideOrCommit) {
        errors['commit_stage_c'] = errors['commit_stage_c'] || {};
        errors['commit_stage_c'].check_commit_stages = true;

        app.alert.show('message-id', {
            level: 'error',
            messages: 'Commit Stage cannot be changed from Upside or from Commit to Funnel',
            autoClose: false
        });
    }

    callback(null, fields, errors);
}, })

使用这种方法,您甚至不必获取Opportunities bean来从数据库获取保存的数据。

感谢所有受访者!唯一对我有用的是:

let changedFields = this.model.changedAttributes(this.model.getSynced());
let CommitStageSaved = changedFields.commit_stage_c;

当我在@Sheikh Rahat Ali的回答中尝试这种方法时,我得到了CommitStageSaved=未定义。当我尝试@Jay的方法并将fetch函数限制为只包含commit_stage_c字段时,我在验证运行之前保存记录时遇到了同样的问题。我从Sugar developer论坛上的a中发现了changedAttributes函数。

据我所知,保存应该等待所有验证任务回调,因此查看您的代码,我还不确定为什么会提前保存。然而,在我看来,虽然速度不是问题所在,但有一种方法可以让抓取更快一些,方法是在抓取选项中指定字段:[commit_stage__c]。谢谢@Jay!这听起来确实有帮助。您能告诉我在fetch中指定字段的语法是什么吗?我找不到它。只要把它放在与success相同的对象中就可以了:OpportunityBean.fetch{success:functionmodel,data{->OpportunityBean.fetch{fields:[commit\u stage\u c],success:functionmodel,data{Sugar已经为您保存了上次同步的状态:this.model.getSyncedcommit_stage_c:Hy Jay我已经按照您的建议使用this.model.getSynced函数更改了我的答案。