百木园-与人分享,
就是让自己快乐。

Odoo 自定义form表单按钮点击事件处理程序

实践环境

Odoo 14.0-20221212 (Community Edition)

代码实现

方案1

通过研究发现,点击odoo form表单按钮时,会调用odoo14\\odoo\\addons\\web\\static\\src\\js\\views\\form\\form_controller.js文件中的_onButtonClicked函数,在该函数中响应点击事件。所以,我们可以通过重写该方法来实现自定义响应点击事件。示例如下

表单视图定义

codePojects\\odoo14\\custom\\estate\\wizards\\demo_wizard_views.xml

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<odoo>
    <data>
        <record id=\"demo_wizard_view_form\" model=\"ir.ui.view\">
            <field name=\"name\">demo.wizard.form</field>
            <field name=\"model\">demo.wizard</field>
            <field name=\"arch\" type=\"xml\">
                <form>
                    //...代码略 
                    <footer>
                        <button name=\"action_confirm\" special=\"other\" type=\"object\" string=\"确认\" class=\"oe_highlight\"/>
                        <button string=\"关闭\" class=\"oe_link\" special=\"cancel\"/>
                    </footer>
                </form>
            </field>
        </record>
        //...代码略        
    </data>
</odoo>

重定义web.FormController以实现重写_onButtonClicked

codePojects\\odoo14/estate/static/src/js/views/form_controller.js

odoo.define(\'customModule.FormController\', function (require) {
    \"use strict\";

 	var formController = require(\'web.FormController\');
	var CustomFormController = formController.extend({
        //--------------------------------------------------------------------------
        // Handlers
        //--------------------------------------------------------------------------

        /**
         * @private
         * @param {OdooEvent} ev
         */
        _onButtonClicked: function (ev) {
            // stop the event\'s propagation as a form controller might have other
            // form controllers in its descendants (e.g. in a FormViewDialog)
            ev.stopPropagation();
            var self = this;
            var def;

            this._disableButtons();

            function saveAndExecuteAction () {
                return self.saveRecord(self.handle, {
                    stayInEdit: true,
                }).then(function () {
                    // we need to reget the record to make sure we have changes made
                    // by the basic model, such as the new res_id, if the record is
                    // new.
                    var record = self.model.get(ev.data.record.id);
                    return self._callButtonAction(attrs, record);
                });
            }
            var attrs = ev.data.attrs;
            if (attrs.confirm) {
                def = new Promise(function (resolve, reject) {
                    Dialog.confirm(self, attrs.confirm, {
                        confirm_callback: saveAndExecuteAction,
                    }).on(\"closed\", null, resolve);
                });
            } else if (attrs.special === \'cancel\') {
                def = this._callButtonAction(attrs, ev.data.record);
            } else if (attrs.special == \'other\') { // 新增自定义事件处理
                self._enableButtons(); // 启用按钮(点击后会自动禁用按钮)
                self.trigger_up(\'close_dialog\'); // 关闭对话框
                return;
            } else if (!attrs.special || attrs.special === \'save\') {
                // save the record but don\'t switch to readonly mode
                def = saveAndExecuteAction();
            } else {
                console.warn(\'Unhandled button event\', ev);
                return;
            }

            // Kind of hack for FormViewDialog: button on footer should trigger the dialog closing
            // if the `close` attribute is set
            def.then(function () {
                self._enableButtons();
                if (attrs.close) {
                    self.trigger_up(\'close_dialog\');
                }
            }).guardedCatch(this._enableButtons.bind(this));
        },
	});

odoo.__DEBUG__[\'services\'][\'web.FormController\'] = CustomFormController;
});

codePojects\\odoo14\\custom\\estate\\views\\webclient_templates.xml

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<odoo>
    <template id=\"assets_common\" inherit_id=\"web.assets_common\" name=\"Backend Assets (used in backend interface)\">
         <xpath expr=\"//script[last()]\" position=\"after\">
             <script type=\"text/javascript\" src=\"/estate/static/src/js/views/form_controller.js\"></script>
         </xpath>
    </template>
</odoo>

codePojects\\odoo14\\custom\\estate\\__manifest__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
{
    \'name\': \'estate\',
    \'depends\': [\'base\'],
    \'data\':[
        # ...略
        \'views/webclient_templates.xml\',
        \'wizards/demo_wizard_views.xml\',
        # ...略
    ]
}

方案2

研究发现,在不为按钮设置type属性的情况下,可以为按钮添加onclick属性,指定点击按钮时需要调用的javascript函数,不过,此时点击按钮,不会再调用web.FormController中定义的_onButtonClicked函数。示例如下:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<odoo>
    <data>
        <record id=\"demo_wizard_view_form\" model=\"ir.ui.view\">
            <field name=\"name\">demo.wizard.form</field>
            <field name=\"model\">demo.wizard</field>
            <field name=\"arch\" type=\"xml\">
                <form>
                    //...代码略 
                    <footer>
                        <button name=\"action_confirm\" do_confirm_action(\'demo.wizard\',\'action_confirm\') string=\"确认\" class=\"oe_highlight\"/>
                        <button string=\"关闭\" class=\"oe_link\" special=\"cancel\"/>
                    </footer>
                </form>
            </field>
        </record>
        //...代码略        
    </data>
</odoo>

codePojects\\odoo14/estate/static/src/js/demo_wizard_views.js

function do_confirm_action(modelName, modelMethod){
    // do something
    //...
    $(\"button[name=\'action_confirm\']\").attr(\"disabled\", true);
}

codePojects\\odoo14\\custom\\estate\\views\\webclient_templates.xml

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<odoo>
    <template id=\"assets_common\" inherit_id=\"web.assets_common\" name=\"Backend Assets (used in backend interface)\">
         <xpath expr=\"//script[last()]\" position=\"after\">
             <script type=\"text/javascript\" src=\"/estate/static/src/js/demo_wizard_views.js\"></script>
         </xpath>
    </template>
</odoo>

作者:授客

微信/QQ:1033553122

全国软件测试QQ交流群:7156436


Git地址:https://gitee.com/ishouke

友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!

作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!

           微信打赏                       
支付宝打赏                  全国软件测试交流QQ群  
Odoo 自定义form表单按钮点击事件处理程序
      Odoo 自定义form表单按钮点击事件处理程序
       Odoo 自定义form表单按钮点击事件处理程序


来源:https://www.cnblogs.com/shouke/p/17094248.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Odoo 自定义form表单按钮点击事件处理程序

相关推荐

  • 暂无文章