注:

本博文是阅读Ruter博客 在odoo中添加自定义页面 后所做的个人总结,以及博文搬迁,主要是便于自己的后期理解;大部分内容为搬运,当然也包括自己的一些总结和流程优化。

前言

首先展示效果:进入odoo模块后,点击一个菜单,会出现一个自定义界面;

要完成自定义页面,需要以下几步:

  • 0.引入相关js库;
  • 1.编写注册xml页面;
  • 2.在js中将动作和xml页面,js事件关联,并进行动作的注册;
  • 3.引入js资源,完成在odoo中正式注册动作;
  • 4.通过菜单调用动作打开页面;

以下是我的模块结构:

示例代码存放在github仓库:在odoo中添加自定义页面

功能实现步骤

0.引入js库

如果你的xml页面,要使用非odoo的第三方js库,可以在static/lib文件夹下面引入;相关js代码可以通过github代码库获取;

1.编写注册xml界面

在static/src/xml文件夹下创建base.xml

<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve"> <t t-name="DemoPage">
<div class="container-fluid py-2 o_web_settings_dashboard">
<div class="form-row">
<div class="col-12 col-lg-6 o_web_settings_dashboard_col">
<wired-card elevation="3">
<div class="mt8">
<wired-input placeholder="Enter name"></wired-input>
</div>
<div>
<wired-radio-group selected="two">
<wired-radio name="one" text="Radio One"></wired-radio>
<wired-radio name="two" text="Radio Two"></wired-radio>
<wired-radio name="three" text="Radio Three"></wired-radio>
</wired-radio-group>
</div>
<div class="mt8 mr8 mb8 text-right">
<wired-button>Cancel</wired-button>
<wired-button elevation="3" class="demo-submit">Submit</wired-button>
</div>
</wired-card>
</div>
</div>
</div>
</t> </templates>

这里定义了一个form表单,使用了wired-elements的相关样式;在xml的第三行有一个t-name的属性,这表示对这个组件的命名,在后续的js文件中需要使用到。

记得在__mainfest__.py文件中使用如下代码注册xml页面;

'qweb': ["static/src/xml/base.xml"]

2.动作定义

在static/src/js文件夹下面创建demo.js文件;

// 自定义页面实际上是一个 client action,也就是客户端动作,通过对 AbstractAction 这个抽象类进行扩展,
// 从而指定自定义页面的模板和页面的事件等
odoo.define('custom_page.demo', function (require) {
"use strict"; var AbstractAction = require('web.AbstractAction');
var core = require('web.core'); var CustomPageDemo = AbstractAction.extend({
// 关联xml组件
template: 'DemoPage',
// 对某个类关联click事件
events: {'click .demo-submit': '_onSubmitClick'}, _onSubmitClick: function (e) {
e.stopPropagation();
alert('Submit clicked!');
}
}); // add方法对动作进行注册,第一个参数表示注册的动作名,第二个参数是要注册的动作对象;
core.action_registry.add('custom_page.demo', CustomPageDemo); return CustomPageDemo; });

上面这段代码的核心部分在 AbstractAction.extend(...) 中。其中 template 指定了自定义页面的模板名称,也就是我们前面所说的 t-name 这个属性;而 events 则定义了页面的一些事件,如该例中,定义的是当点击(click)带有类 .demo-submit 的元素时执行 _onSubmitClick 这个方法。
需要注意的是,我们需要通过 core.action_registry.add() 这个方法对动作进行注册,第一个参数表示注册的动作名(tag),第二个参数是要注册的动作对象。

3.动作注册

在views下创建templates.xml文件;

<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="assets_backend" name="custom page assets" inherit_id="web.assets_backend">
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/custom_page/static/lib/wired-elements/wired-elements.bundled.min.js"></script>
<script type="text/javascript" src="/custom_page/static/src/js/demo.js"></script>
</xpath>
</template>
</data>
</odoo>

一般情况下都是在 views/templates.xml 中继承 web.ssets_backend 后在其末尾添加相关资源路径;

引入资源之后可以完成动作在odoo中的正式注册;你可以理解为前面编写的js文件相当于写了一张提薪申请表,现在资源的引入相当于提交申请表。

4.菜单调用动作

在views文件夹中创建views.xml

<odoo>
<data>
<record id="action_custom_page" model="ir.actions.client">
<field name="name">Custom Page</field>
<field name="tag">custom_page.demo</field>
</record> <menuitem id="menu_root_custom_page" name="自定义页面" action="action_custom_page" groups="base.group_user" sequence="1"/>
</data>
</odoo>

当点击自定义页面菜单时,调用 action_custom_page 的客户端动作,而 action_custom_page 动作会调用前面定义 custom_page.demo 动作,动作会返回xml界面,从而实现在菜单中显示自定义界面。

odoo13之在odoo中添加自定义页面的更多相关文章

  1. Inno Setup技巧[实例]添加自定义页面

    原文 http://hi.baidu.com/watashi/item/b3dda993459ff8f0291647a0 通过“添加自定义页面”可以丰富安装程序的功能.本文以添加一个页面“选择安装类型 ...

  2. C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理

    C#编译器优化那点事   使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...

  3. Python odoo中嵌入html简单的分页功能

    在odoo中,通过iframe嵌入 html,页面数据则通过controllers获取,使用jinja2模板传值渲染 html页面分页内容,这里写了判断逻辑 <!-- 分页 -->< ...

  4. Odoo中的五种Action详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826232.html Odoo中的五种action都是继承自ir.actions.actions模型实现的 ...

  5. Odoo中Qweb使用入门

    参考 可参考官网例子https://doc.odoo.com/trunk/web/qweb/或 http://thierry-godin.developpez.com/openerp/tutorial ...

  6. 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

    如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...

  7. div中显示页面

    在css中显示页面,在页面布局中很多时候都要在一个div 里显示某些页面.在这里写下我用到的一种方式. <script type="text/javascript"> ...

  8. iOS 一个app跳转另一个app并实现通信(如A跳到B并打开B中指定页面)

    功能实现:A跳到B并打开B中指定页面 步骤: 1.首先创建两个项目(项目A,项目B),在项目B中的info.plist文件中添加URL Types,如下图所示:其中URL idenifier是项目B的 ...

  9. HTML5中与页面显示相关的API

    1.HTML5中与页面显示相关的API 在HTML5中,增加了几个与页面显示相关的API,其中一个是Page Visibility API Page Visibility API  是指当页面变为最小 ...

随机推荐

  1. 喵的Unity游戏开发之路 - 轨道摄像机

    前言        很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3 ...

  2. http请求工作流程

    一.HTTP工作原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包 ...

  3. Java GUI 图书管理系统

    01 概述 一款功能强大的图书馆管理系统,功能齐全,小白/大学生项目实训,学习的不二之选. 02 技术 此系统使用 java awt 实现.java.awt是一个软件包,包含用于创建用户界面和绘制图形 ...

  4. AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)

    题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...

  5. Java面试题(JVM篇)

    JVM 194.说一下 jvm 的主要组成部分?及其作用? 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库 ...

  6. akka-grpc - 应用案例

    上期说道:http/2还属于一种不算普及的技术协议,可能目前只适合用于内部系统集成,现在开始大面积介入可能为时尚早.不过有些项目需求不等人,需要使用这项技术,所以研究了一下akka-grpc,写了一篇 ...

  7. drf中View和router的详解

    Rest Framework 视图和路由 因为涉及到视图层面了,而且下面的例子会反复用到request.data,所以我决定带大家稍微看下源码,感兴趣的可以自己深入了解 无论是View还是APIVie ...

  8. Fitness - 05.23

    倒计时222天 运动40分钟,共计8组,4.2公里.拉伸10分钟. 每组跑步3分钟(6.5KM/h),走路2分钟(5.5KM/h). 终于赶在姨妈前完成第3周的跑步训练了,可喜可贺~~ 下周预计要休息 ...

  9. 浅析一个lua文件窥slua工作机制

    slua的东西不是几句话能讲得完,这里只说结论不说原因,原因有空写个Little Slua工程来解释,下面注释中有几个关键点:LuaVar系列类:LuaFunction,LuaTable,LuaDel ...

  10. 如何配置node环境变量

    1,安装node.js   最后安装的目录在 检测node安装成功   node -v 如果报错   没有默认装在c盘  pro 需要配置环境变量 Npm   node  package  manag ...