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

文/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.mzph.cn/news/754230.shtml

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

相关文章

【ceph】配置 ceph dashboard 详细配置过程

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

C++ QT串口通信(1)-串口模块QtSerialPort详解

本文讲解C++ QT串口模块QtSerialPort。 目录 一、串口通信基础与QtSerialPort模块简介 1.1 串口通信基础 1.2 QtSerialPort模块简介

环境变量和Bash内置命令

Command Line Editing Ctrla#Move to the start of the line.(光标移到最前面) Ctrle#Move to the end of the line.(光标移到最后面) Ctrll#Clear the screen, reprinting the current line at the top.(不等同clear命令.会在顶部重新打印当前行,当前行还有内容时,还会显示) …

放慢音频速度的三个方法 享受慢音乐

如何让音频慢速播放&#xff1f;我们都知道&#xff0c;在观看视频时&#xff0c;我们可以选择快进播放&#xff0c;但是很少有软件支持慢速播放。然而&#xff0c;将音频慢速播放在某些情况下是非常必要的。例如&#xff0c;当我们学习一门新语言时&#xff0c;我们可以将音频…

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…

动态代理IP在反爬虫策略中的实战运用与挑战

动态代理IP在反爬虫策略中的实战运用与挑战是现代网络数据抓取领域中一个核心议题。动态代理IP服务允许爬虫程序通过不断切换不同的IP地址来访问目标网站&#xff0c;以应对各种反爬虫技术措施&#xff0c;主要包括以下几点&#xff1a; 实战运用&#xff1a; 1. 绕过IP限制&a…

React——关于事件处理

如何注册事件 驼峰命名法&#xff0c;语法on事件名&#xff5b;事件处理程序&#xff5d; 比如onClick{this.buttonClick} class App extends React.Component {render() {return (<div><button onClick{this.buttonClick}>点击按钮触发事件</button></di…

深度学习神经网络相关记录《二》

如何判断模型是一个好模型&#xff1f; 模型预测效果&#xff0c;也就是模型预测的准确率运算速度&#xff1b;能够处理大量数据、短时间内急速学习、可以实时进行预测&#xff0c;是机器学习的重要优势&#xff1b;可解释性&#xff1b;深度学习已经不太关系这一点了&#xf…

macOS安装erlang以及rabbitMq详情版本

1.利用HomeBrew安装&#xff0c;如果你电脑没有HomeBrew可以跳转到HomeBrew安装教程 https://blog.csdn.net/weixin_50268501/article/details/136820299 2.要想运行rabbitMq要有Erlang 安装erlang brew install erlang3.安装RabbitMq brew install rabbitmq4.执行完上述命令…

基础:TCP三次握手做了什么,为什么要握手?

1. TCP 三次握手在做些什么 1. 第一次握手 &#xff1a; 1&#xff09;握手作用&#xff1a;客户端发出建立连接请求。 2&#xff09;数据处理&#xff1a;客户端发送连接请求报文段&#xff0c;将SYN位置为1&#xff0c;Sequence Number为x;然后&#xff0c;客户端进入SYN_S…

基于Matlab的视频人面检测识别,Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

分布式(计算机算法)

目录 分布式计算 分布式​编辑 分布式和集群 分布式和集群的应用场景 分布式应用场景 集群应用场景 哪种技术更优、更快、更好呢 性能 稳定性 以下概念来源于百度百科 分布式计算 分布式计算是近年提出的一种新的计算方式。所谓分布式计算就是在两个或多个软件互相共享信息…

【uniapp】uniapp设置改变全局字体大小功能:

文章目录 一、效果&#xff1a;二、文档&#xff1a;三、案例&#xff1a;引用插件&#xff0c;将项目中的字体单位rpx换成rem&#xff0c;结合官网提供的page-meta属性&#xff0c;通过控制根字体大小&#xff0c;达到调节字体大小要求。 一、效果&#xff1a; 二、文档&#…

Bash Shell中双引号中的感叹号问题详解

Bash Shell中双引号中的感叹号问题详解 在Bash Shell中&#xff0c;感叹号(!)是一个特殊字符&#xff0c;主要用于历史扩展。历史扩展允许你使用!来引用历史命令。然而&#xff0c;当你在双引号中使用感叹号时&#xff0c;如果你在双引号中直接使用感叹号&#xff0c;它可能会…

redis cpu百分百问题

系统使用spring cloud alibaba微服务框架&#xff0c;应用使用K8S发布&#xff0c;使用redis作为缓存数据库&#xff0c;运行一段时间之后开发反应早高峰时整个系统响应缓慢&#xff0c;排查发现服务网关gateway的pod健康状态频繁unhealthy&#xff0c;导致重启&#xff0c;且此…

冯米塞斯应力(von Mises stress)云图的MATLAB计算方法

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material

代码随想录算法训练营第46天 | 完全背包,139.单词拆分

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 完全背包理论基础&#xff1a; https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9…

全网最全的幻兽帕鲁服务器搭建教程——阿里云保姆级教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

DVWA靶场-SQL InjectionSQL注入

SQL Injection&#xff08;SQL注入&#xff09;概念 就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。具体来说&#xff0c;它是利用现有应用程序&#xff0c;将&#xff08;恶意&#xff09;的SQL命令注…

YOLOv2学习

YOLOv2学习 Anchor boxes 和 bounding boxes 的区别锚框&#xff08;Anchor Boxes&#xff09;边界框&#xff08;Bounding Boxes&#xff09;锚框与边界框的区别 摘要引言数据集组合方法&#xff08;Dataset Combination Method&#xff09;联合训练算法&#xff08;Joint Tra…