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

yizhihongxing

实践环境

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>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Odoo 自定义form表单按钮点击事件处理程序 - Python技术站

(0)
上一篇 2023年3月31日 下午9:05
下一篇 2023年3月31日 下午9:05

相关文章

  • odoo 通过Javascript显示或隐藏form自带按钮

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示、隐藏进行控制 代码实现 隐藏、显示编辑和创建按钮为例 odoo14/custom/estate/static/src/js/hide_or_show_form_button.js function isHideEdit…

    2023年3月31日
    00
  • Odoo 通过Javascript调用模型中自定义方法

    实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 在js脚本函数中调用模型中自定义方法: this._rpc({ model: ‘demo.wizard’, // 模型名称,即模型类定义中 _name 的值 method: ‘action_select_records_via_checkbox’, // 模型中…

    Python开发 2023年3月31日
    00
  • Odoo 菜单定义和修改学习总结

    odoo菜单定义和修改学习总结 环境 odoo-14.0.post20221212.tar 定义菜单 方式1: <?xml version=”1.0″?> <odoo> <menuitem id=”root_menu_id” name=”TopMenu” web_icon=”estate,static/img/icon.png”…

    Python开发 2023年3月31日
    00
  • odoo 开发入门教程系列-QWeb简史

    QWeb简史 到目前为止,我们的房地产模块的界面设计相当有限。构建列表视图很简单,因为只需要字段列表。表单视图也是如此:尽管使用了一些标记,如<group>或<page>,但在设计方面几乎没有什么可做的。 然而,如果我们想给我们的应用程序一个独特的外观,就必须更进一步,能够设计新的视图。此外,PDF报告或网站页面等其他功能需要另一个更…

    python 2023年4月22日
    00
  • odoo Actions学习总结

    环境 odoo-14.0.post20221212.tar Actions(动作) action定义系统响应用户操作的行为:登录、操作按钮、选择发票等… action可以存储在数据库中,也可以作为字典直接返回,例如按钮方法。所有Action都有两个强制属性: type 当前Action的类别,决定可以使用哪些字段以及如何解释action name actio…

    Python开发 2023年3月31日
    00
  • odoo 为可编辑列表视图字段搜索添加查询过滤条件

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下图,列表网仓记录详情页面(form视图),编辑内联视图中的货主记录,为货主和仓库字段搜索,添加过滤条件,具体如下: 添加、编辑货主时,下拉列表中只展示选取和当网仓记录所属公司关联的货主,点击搜索更多,仅展示和当前网仓记录所属公司关联的货主 添加、编辑货主时,…

    2023年3月31日
    00
  • odoo 开发入门教程系列-约束(Constraints)

    约束(Constraints) 上一章介绍了向模型中添加一些业务逻辑的能力。我们现在可以将按钮链接到业务代码,但如何防止用户输入错误的数据?例如,在我们的房地产模块中,没有什么可以阻止用户设置负预期价格。 odoo提供了两种设置自动验证恒定式的方法:Python约束 and SQL约束。 SQL 参考:与此主题相关的文档可以查看 Models 和Postgr…

    python 2023年4月18日
    00
  • Odoo 基于Win10搭建基于Win10搭建odoo14开发环境搭建

    实践环境 win10 Python 3.6.2 odoo_14.0.latest.tar.gz下载地址: https://download.odoocdn.com/download/14/src?payload=MTY3MDg1MTM3Ni4xNC5zcmMud0tZRWZLX2I5UVF0Tm51UUVqT1lQVE5PbGRyYW5zWTc4dHhuOW…

    2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部