实践环境

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <odoo>
  3. <data>
  4. <record id="demo_wizard_view_form" model="ir.ui.view">
  5. <field name="name">demo.wizard.form</field>
  6. <field name="model">demo.wizard</field>
  7. <field name="arch" type="xml">
  8. <form>
  9. //...代码略
  10. <footer>
  11. <button name="action_confirm" special="other" type="object" string="确认" class="oe_highlight"/>
  12. <button string="关闭" class="oe_link" special="cancel"/>
  13. </footer>
  14. </form>
  15. </field>
  16. </record>
  17. //...代码略
  18. </data>
  19. </odoo>

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

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

  1. odoo.define('customModule.FormController', function (require) {
  2. "use strict";
  3. var formController = require('web.FormController');
  4. var CustomFormController = formController.extend({
  5. //--------------------------------------------------------------------------
  6. // Handlers
  7. //--------------------------------------------------------------------------
  8. /**
  9. * @private
  10. * @param {OdooEvent} ev
  11. */
  12. _onButtonClicked: function (ev) {
  13. // stop the event's propagation as a form controller might have other
  14. // form controllers in its descendants (e.g. in a FormViewDialog)
  15. ev.stopPropagation();
  16. var self = this;
  17. var def;
  18. this._disableButtons();
  19. function saveAndExecuteAction () {
  20. return self.saveRecord(self.handle, {
  21. stayInEdit: true,
  22. }).then(function () {
  23. // we need to reget the record to make sure we have changes made
  24. // by the basic model, such as the new res_id, if the record is
  25. // new.
  26. var record = self.model.get(ev.data.record.id);
  27. return self._callButtonAction(attrs, record);
  28. });
  29. }
  30. var attrs = ev.data.attrs;
  31. if (attrs.confirm) {
  32. def = new Promise(function (resolve, reject) {
  33. Dialog.confirm(self, attrs.confirm, {
  34. confirm_callback: saveAndExecuteAction,
  35. }).on("closed", null, resolve);
  36. });
  37. } else if (attrs.special === 'cancel') {
  38. def = this._callButtonAction(attrs, ev.data.record);
  39. } else if (attrs.special == 'other') { // 新增自定义事件处理
  40. self._enableButtons(); // 启用按钮(点击后会自动禁用按钮)
  41. self.trigger_up('close_dialog'); // 关闭对话框
  42. return;
  43. } else if (!attrs.special || attrs.special === 'save') {
  44. // save the record but don't switch to readonly mode
  45. def = saveAndExecuteAction();
  46. } else {
  47. console.warn('Unhandled button event', ev);
  48. return;
  49. }
  50. // Kind of hack for FormViewDialog: button on footer should trigger the dialog closing
  51. // if the `close` attribute is set
  52. def.then(function () {
  53. self._enableButtons();
  54. if (attrs.close) {
  55. self.trigger_up('close_dialog');
  56. }
  57. }).guardedCatch(this._enableButtons.bind(this));
  58. },
  59. });
  60. odoo.__DEBUG__['services']['web.FormController'] = CustomFormController;
  61. });

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

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

codePojects\odoo14\custom\estate\__manifest__.py

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. {
  4. 'name': 'estate',
  5. 'depends': ['base'],
  6. 'data':[
  7. # ...略
  8. 'views/webclient_templates.xml',
  9. 'wizards/demo_wizard_views.xml',
  10. # ...略
  11. ]
  12. }

方案2

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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <odoo>
  3. <data>
  4. <record id="demo_wizard_view_form" model="ir.ui.view">
  5. <field name="name">demo.wizard.form</field>
  6. <field name="model">demo.wizard</field>
  7. <field name="arch" type="xml">
  8. <form>
  9. //...代码略
  10. <footer>
  11. <button name="action_confirm" do_confirm_action('demo.wizard','action_confirm') string="确认" class="oe_highlight"/>
  12. <button string="关闭" class="oe_link" special="cancel"/>
  13. </footer>
  14. </form>
  15. </field>
  16. </record>
  17. //...代码略
  18. </data>
  19. </odoo>

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

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

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

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

Odoo 自定义form表单按钮点击事件处理程序的更多相关文章

  1. 利用 ajax自定义Form表单的提交方式

    需求场景:有时候单纯的form表单无法向后端传递额外的参数 比如需要action传递js异步生成的参数 ,form表单默认的action就无法满足需求,这时就需要我们自定义form表单的提交方式. h ...

  2. python26:自定义form表单验证

    一.自定义Form的原理 1.1 各种form表单验证比较 只有python提供了form表单验证,其他的都没有提供.django提供的功能还不够强大.最强大的是微软的ASP.NET!我们可以自己写一 ...

  3. iview form表单数值类型校验「iview自定义form表单校验器」

    摘录iview表单验证 Form 组件基于 sync-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. ...

  4. web前端框架之自定义form表单验证

    自定义form验证初试 .在后端创建一个类MainForm,并且在类中自定义host ip port phone等,然后写入方法,在post方法中创建MainForm对象,并且把post方法中的sel ...

  5. tornado之自定义form表单验证

    直接上链接吧:银角的地址 源码下载链接:点我点我点我...

  6. DuiLib笔记之自定义标题栏以及响应按钮点击事件

    在博文DuiLib笔记,基于WindowImplBase的基础模板的基础上,修改皮肤文件如下 <?xml version="1.0" encoding="utf-8 ...

  7. form表单的字符串进行utf-8编码

    <form>表单有assept-charset属性.该属性规定字符的编码方式,默认是"unknown",与文档的字符集相同. 该属性除了Internet explore ...

  8. 提交Form表单,submit之前做js判断处理

    效果: 在点击提交按钮时,首先进行js判断, 如果不符合条件,则alert出提示信息,并return false. 主要点就在于给form表单添加一个onsubmit事件. 在onsubmit事件中定 ...

  9. form 表单提交返回值问题

    form不比ajax,即使后台返回值后,在页面也不知道怎么去取值判断提交状态.所以前几天结合网上资料整了一个小案例,需要用到ajaxSubmit,即通过ajax来提交表单,好处在于可以在任何情况下进行 ...

  10. 看用Tornado如何自定义实现表单验证

    我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单验证功能,但是对于Tornado而言, ...

随机推荐

  1. 什么是Token?为什么大模型要计算Token数

    本文分享自华为云社区<[技术分享]什么是Token?为什么GPT基于Token定价>,作者:开天aPaaS小助手Tracy. 在使用LLM大模型时,我们经常会遇到一个关键词,叫:Token ...

  2. docker离线安装

    1. yum安装 #源添加 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ...

  3. Kubernetes操作图

  4. 01.Alpine编译glibc

    概要 本文档采用glibc2.28版本作为示例,模拟内网环境无法访问github等开源社区 为精简docker容器镜像,采用Alpine镜像,需要手动编译glibc源代码 制作编译好的glibc二进制 ...

  5. vim 多文件编辑

    使用vim打开多个文件 vim可以同时打开好几个文件同时进行编辑 [root@localhost opt]# vim ip.txt time.txt 2 files to edit ens32: fl ...

  6. 获取某一个数的2进制位数以及bitmask

    举例说明:比如32对应的2进制为2b'100000,对应的bitmask为2b'11111. 实现代码: #include <stdio.h> typedef unsigned char ...

  7. log4net info 方法 根据不同业务创建不同的文件名

    log4net info 方法 根据不同业务创建不同的文件名 <configuration> <!-- ... 其他配置 ... --> <configSections& ...

  8. 小米 红米 Redmi MIUI14 ANDROID 系统 耗电

    小米 红米 Redmi MIUI14 ANDROID 系统 耗电 在系统更新里,点右上角三点,下载完整更新包,安装好.再把电量用到关机,充电,充满开机,别拔线,继续充10分钟.我就是这么解决的,今天用 ...

  9. 使用nginx 中转 https tls1.3 请求

    对方服务器使用的是TLS1.3,并关闭了一些算法套件,使得.NET FRAMEWORK 4.8 ..NET 5 都无法连接. 只能用中转方案解决. nginx配置: #user nobody; wor ...

  10. core dump 路径定义以及监控

    Core Dump 是什么? Core Dump 是指进程异常退出时,操作系统将进程的内存状态保存到文件中,这个文件就是 Core Dump 文件,中文一般翻译为"核心转储",哈, ...