Odoo17免费开源ERP开发技巧:如何在表单视图中调用JS类

news2024/11/17 21:40:36

文/Odoo亚太金牌服务·开源智造 老杨

在Odoo最新V17新版中,其突出功能之一是能够构建个性化视图,允许用户以独特的方式与数据互动。本文深入探讨了如何使用 JavaScript 类来呈现表单视图来创建自定义视图。通过学习本教程,你将获得关于开发Odoo 17前端交互的开发指南与建议,改善Odoo原有的本土化用户体验不佳的问题。

我们将探讨如何使用JavaScript类功能在Odoo中自定义表单视图。我们将首先向 XML 视图添加一个自定义按钮,单击该按钮将触发 JavaScript 函数。我们将逐步浏览 JavaScript 代码以理解它是如何工作的。在本文的最后,您将更好地了解如何使用JavaScript来增强Odoo的功能。

JavaScript 类函数通过为特定视图注册类来运行。当我们将此类添加到窗体视图时,它会将自定义视图注入到窗体中。为此,我们必须将自定义视图创建为模板,将其注册为组件,然后将其链接到表单控制器。因此,表单控制器在加载视图时检测到指定的类时将执行视图。

在下面的截图中,会注意到使用 JavaScript 类“model_info”集成到表单视图中的“Info”按钮。

在这里,我们继承了销售订单窗体,并添加了值为“model_info”的属性“js_class”。

<?xml version="1.0"?>
<odoo>
   <record id="view_sale_order_form_inherit" model="ir.ui.view">
       <field name="name">sale.order</field>
       <field name="model">sale.order</field>
       <field name="inherit_id" ref="sale.view_order_form"/>
       <field name="arch" type="xml">
           <xpath expr="//form" position="attributes">
               <attribute name="js_class">model_info</attribute>
           </xpath>
       </field>
   </record>
</odoo>

首先,表单控制器验证 JS 类是否保存在注册表中。为此,我们在核心注册表中的自定义视图中注册该类。

在这里,我们通过添加按钮作为模板来继承基本窗体视图。

<templates>
   <t t-name="blog_js_class.modelInfoBtn" t-inherit="web.FormView">
       <xpath expr="//t[@t-set-slot='layout-actions']" position="inside">
           <button class="btn btn-primary" t-on-click="actionInfoForm">Info
           </button>
       </xpath>
   </t>
</templates>

在这里,我们有一个按钮标签,里面有一个点击函数“actionInfoForm()”。现在,我们将模板扩展到组件中,以呈现视图以及从按钮单击调用的函数。

/** @odoo-module **/
import { FormController } from "@web/views/form/form_controller";
import { formView } from '@web/views/form/form_view';
import { registry } from "@web/core/registry";
import { jsClassDialog } from "@blog_js_class/js/js_blog_dialog";
class jsClassModelInfo extends FormController {
   actionInfoForm(){
       this.env.services.dialog.add(jsClassDialog, {
           resModel: this.props.resModel,
           resDesc: "This is a demo pop-up; feel free to customize the functionality to meet your requirements."
       });
   }
}
jsClassModelInfo.template = "blog_js_class.modelInfoBtn";
export const modelInfoView = {
   ...formView,
   Controller: jsClassModelInfo,
};
registry.category("views").add("model_info", modelInfoView);

在此代码块中,我们导入注册模板所需的类。我们通过扩展formController创建一个新类,并将模板保存到其中。然后,我们使用常量将其导出到控制器。最后,我们在核心注册表的视图类别下注册它,js_class为“model_info”。

现在模板已经注册,在这个扩展类中,你将找到函数actionInfoForm(),它会弹出一个对话框。在Odoo17中,要弹出对话框,我们需要创建一个新组件。在这里,您可以看到在 Owl 组件类中注册的对话框模板及其值。

/** @odoo-module **/
import { Component } from "@odoo/owl";
import { Dialog } from "@web/core/dialog/dialog";
import { _t } from "@web/core/l10n/translation";
export class jsClassDialog extends Component{
    clickClose() {
        this.props.close()
    }
}
jsClassDialog.template = "blog_js_class.infoDialog";
jsClassDialog.components = { Dialog };
jsClassDialog.title = _t("Model Info"),
jsClassDialog.props = {
    confirmLabel: { type: String, optional: true },
    confirmClass: { type: String, optional: true },
    resModel: { type: String, optional: true },
    tools: Object,
    close: { type: Function, optional: true },
    };
jsClassDialog.defaultProps = {
    confirmLabel: _t("Close"),
    confirmClass: "btn-primary",
};
<templates>
   <t t-name="blog_js_class.infoDialog">
       <Dialog size="'md'" title="'Model Info'" modalRef="modalRef">
           <div class="">
               <h6>Model:</h6>
               <span>
                   <t t-esc="props.resModel"/>
               </span><br/>
               <h6>Description:</h6>
               <span>
                   <t t-esc="props.resDesc"/>
               </span>
           </div>
           <t t-set-slot="footer">
               <button class="btn" t-att-class="props.confirmClass"
                       t-on-click="clickClose" t-esc="props.confirmLabel"/>
           </t>
       </Dialog>
   </t>
</templates>

通过导入类 “jsClassDialog” 并将其添加到环境对话框服务中,我们可以弹出该对话框。

import { jsClassDialog } from "@blog_js_class/js/js_blog_dialog";
actionInfoForm(){
   this.env.services.dialog.add(jsClassDialog, {
       resModel: this.props.resModel,
       resDesc: "This is a demo pop-up; feel free to customize the functionality to meet your requirements."
   });
}

现在,让我们在单击“Info”按钮时看到对话框。

总之,Odoo中的JS类功能对于开发人员来说是一个宝贵的资源,提供了根据需要自定义工作流程的灵活性。它为集成JavaScript功能提供了许多可能性,从而增强了具有JS类功能的Odoo表单视图,并最大限度地发挥了其潜力。最终,这将为用户带来更具适应性和效率的开源ERP系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xiaohongshu Shield 8.27

支持自己传输 xy-ter-str, 进行设备绑定计算 也支持自动请求初始化设备&#xff0c;无需 xy-ter-str 传输参数&#xff1a;url , xy-platform-info, xy-common-params,device_id 以及 xy-ter-str 精准计算&#xff0c;纯算法源码还原魔改算法&#xff0c;非jar 非unidbg 非调…

hash+前缀和:和可被k整除的子数组

题目 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k 5 输出&#xff1a;7 解释&#x…

VBA技术资料MF131:代码执行过程中实现毫秒等待

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

WordPress上传大于 2560 像素的图片文件

本周有一个Hostease客户&#xff0c;购买美国Linux主机创建WordPress站点&#xff0c;在WP后台上传图片&#xff0c;遇到错误信息&#xff0c;联系我们问询解决方案。Linux主机提供cPanel面板&#xff0c;集成一键安装WordPress与建站。接下来&#xff0c;我们分享这个问题的解…

【云呐】固定资产管理系统的功能有哪些?管理工具

为了提高经营效率&#xff0c;降低企业成本&#xff0c;许多企业选择固定资产管理系统。那么&#xff0c;固定资产管理系统有什么作用呢&#xff1f; 资产登记&#xff1a;  固定资产管理系统可以方便地登记公司的固定资产&#xff0c;包括资产名称、规格型号、购买日期、使…

(done) 解释 python3 torch.utils.data DataLoader

特别注意&#xff1a;DataLoader 返回的迭代器是无尽的&#xff0c;依据如下 (CHATGPT3.5) DataLoader 返回的迭代器默认情况下是无尽的&#xff0c;因为它会无限地循环遍历数据集&#xff0c;以提供批量的数据。在训练神经网络时&#xff0c;通常会使用无尽的迭代器来循环遍历…

测试工具分享:高效完成测试工作!

说在前头 在社会上&#xff0c;特别是技术圈&#xff0c;大家会有刻板印象&#xff1a;测试工作的含金量不高。因为大家觉得测试不重要&#xff0c;导致给测试的薪水也偏低&#xff1b;这又反向导致好的人才不想来测试行业&#xff0c;测试从业人员的平均水平、工作体现的价值…

Gif动画是如何制作的?用这个网站试试

GIF动图制作是一种流行的图像处理技术&#xff0c;它可以将一系列的静态图像合成为一个连续播放的动画。GIF动图在互联网上广泛应用&#xff0c;成为了表达情感、分享趣味和展示产品的有力工具。想要制作gif动图可以使用专业的Gif动态图片制作工具-GIF中文网&#xff0c;无需下…

代码随想录算法训练营第day26|39. 组合总和、 40.组合总和II、 131.分割回文串

39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 ta…

如何使用 ArcGIS Pro 分析爆炸波及建筑

创建三维图层 在工具箱中点击“3D Analyst 工具\3D要素\转换\依据属性实现要素转3D”,调用依据属性实现要素转3D工具,如下图所示。 调用依据属性实现要素转3D工具 在显示的依据属性实现要素转3D对话框内,输入要素为爆炸点图层,选择高度字段,如下图所示。 依据属性实现…

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

WIN10系统不定时蓝屏,终止代码:KERNEL_DATA_INPAGE_ERROR,且无法保存蓝屏日志解决办法

程序代码园发文地址&#xff1a;WIN10系统不定时蓝屏&#xff0c;终止代码&#xff1a;KERNEL_DATA_INPAGE_ERROR&#xff0c;且无法保存蓝屏日志解决办法-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,WIN10系统不定时蓝屏&#xff0c;终止代码&am…

springboot实战笔记

用户模块开发 用户登录接口实现 根据token获取用户信息 检查账号是否可用 用户注册接口实现

论文笔记:Llama 2: Open Foundation and Fine-Tuned Chat Models

导语 Llama 2 是之前广受欢迎的开源大型语言模型 LLaMA 的新版本&#xff0c;该模型已公开发布&#xff0c;可用于研究和商业用途。本文记录了阅读该论文的一些关键笔记。 链接&#xff1a;https://arxiv.org/abs/2307.09288 1 引言 大型语言模型&#xff08;LLMs&#xff…

python异常:Exception、BaseException接收异常,并打印异常信息msg

except IOEerror 只能接收到 IO 类型的错误&#xff0c;对于抛出的 NameError 类型的错误&#xff0c;在 Python 中所有的异常类都继承 Exception&#xff0c;所以我们可以使用它来接收所有的异常。 1.Exception接收异常 源码&#xff1a; open("test1.py",r) pr…

什么是React属性钻取(Prop Drilling)

一、介绍 在React开发过程中&#xff0c;状态管理是一个绕不开的话题。无论是新手还是有经验的开发者&#xff0c;都会面临如何有效管理组件状态的挑战。React为我们提供了多种状态管理方案&#xff0c;如直接的状态传递&#xff08;俗称"属性钻取"&#xff09;、Co…

【Android】工厂测试中 局部 字体显示重叠 问题分析与解决(Android14)

继上一篇【Android】工厂模式中 字体大小/显示重叠/显示不完整 相关 问题分析与解决 的分析与解决&#xff0c;可以实现调整所有字符整体的宽高。 但在局部&#xff0c;如果只希望修改局部的某一行字符的样式&#xff0c;且这一行字符没有直接的资源布局控制文件&#xff0c;而…

YOLOv8独家改进:block改进 | RepViTBlock和C2f进行结合实现二次创新 | CVPR2024清华RepViT

💡💡💡本文独家改进:CVPR2024 清华提出RepViT:轻量级新主干!从ViT角度重新审视移动CNN,RepViTBlock和C2f进行结合实现二次创新 改进结构图如下: 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡…

modbus客户端

通信方式支持 串口 / udp / tcp通信&#xff1b; 设备协议支持RTU / ASCII / TCP&#xff1b; 读取类型支持bool / short / int / float / double / long / batchbool / batchword