2

我正在将支付提供商集成到 ExtJS 网站中。

基本上,需要创建一个表单,并使用 Ajax 将表单字段发送给支付提供商。

问题是支付提供商不允许表单字段具有分配给“”标签的“名称”参数。他们对实施进行手动检查,并确保它不存在。

当访问者禁用 Ajax 并且表单被提交到我的服务器时,我认为这是一种反措施,从而显示信用卡。我知道这对 ExtJS 没有任何意义,因为如果没有打开 Javascript,它就无法工作,但无论如何,这是支付提供商的规则。

那么,如何强制 ExtJS 不在表单字段中放置“名称”参数?我尝试将“名称:''”放入字段中,但这被忽略了。

我是否使用 ExtJS 中的模板系统来解决这个问题?

4

3 回答 3

4

所以 Eric 是完全正确的,它可以比修改整个模板更容易完成,但我会在这种特殊情况下使用插件。我做了一个快速的:

Ext.define('Ext.form.field.plugin.NoNameAttribute', {
    extend: 'Ext.AbstractPlugin',
    alias: 'plugin.nonameattribute',
    init: function(cmp) {
        Ext.Function.interceptAfterCust(cmp, "getSubTplData", function(data){
            delete data['name'];
            return data;
        });
    }
});

请注意,使用的方法interceptAfterCust是我的一种自定义方法,它通过将原始结果作为参数传递给拦截方法来修改现有方法。它还使用给定的原始对象(可以作为范围受到威胁)作为原始方法的范围。最简单的方法是将这些方法添加到Ext.Function

Ext.Function.interceptAfterCust = function(object, methodName, fn, scope) {
    var method = object[methodName] || Ext.emptyFn;

    return (object[methodName] = function() {
        return fn.call(scope || this, method.apply(object, arguments));
    });
}

这是一个有效的 JSFiddle,其中第一个字段在 dom 上不会有 name 属性,即使它存在于组件中。

于 2013-07-23T06:34:28.930 回答
0

有一个非常简单的解决方案。我用Ext.form.field.Textand对其进行了测试Ext.form.field.ComboBox,它运行良好,但我不知道它是否适用于所有表单字段,或者是否有任何负面影响。谨慎使用。

Ext.define('Override.form.field.Base', {
    override: 'Ext.form.field.Base',

    getSubTplData: function(){
        var data = this.callParent(arguments);
        delete data.name;
        return data;
    }
});

基本上,它会在传递之前从渲染数据中删除自动生成的名称。最好的部分是不涉及私有方法,因此这应该是一个稳定的解决方案。

于 2013-07-23T00:56:48.193 回答
0

我更喜欢在字段配置选项中使用它:

submitValue: false

从 ExtJS 3.4 开始可用

于 2016-03-02T23:55:40.450 回答