基于wol学习自定义odoo的widget
简介:
- 图片显示静态分离(不再存在odoo数据库中,默认的二进制存储,不再存在odoo的web服务器中)
- 使用EasyImage2.0存储(有token认证的api上传图床)
- 用户很简单的使用页面widget,上传图片,自动转存图床,更新存储字段为url,更新预览,双击放大
参考教程:
https://www.oocademy.com/v15.0/tutorial/introduction-to-owl-115#-Expanding-our-widget
一:owl基本结构
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/9b491069b442f748fb5263dff6264a403e9749a1
与 Odoo 开发一样,我们必须使用一个新模块。让我们设置一个最简单的,以便我们可以尝试一些 OWL 功能。
__init__.py是空的,
只定义了__manifest__.py文件的一些基本信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # -*- coding: utf-8 -*- # code:__manifest__.py { 'name' : "jack_url_image" , 'summary' : """图片挂件改存api图床""" , 'description' : """图片挂件改存api图床""" , 'author' : "jackadam" , 'website' : "http://www.baidu.com" , 'category' : 'Administration' , 'version' : '15.0.0.1' , 'depends' : [ 'base' ], 'installable' : True , 'application' : True , 'auto_install' : False , } |
安装一下,应该没什么问题的。
二:创建并注册js类
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/4cf37c526b792be55b393a3ec5006d4ccbc09022
我们的新组件文件JackUrlImage.js将被调用
,我们将把它添加到static/src/js/components/
.
1 2 3 4 5 6 7 8 9 | // code:myaddons/jack_url_image/static/src/js/components/JackUrlImage.js odoo.define( "jack_url_image.JackUrlImage" , function (require) { const { Component } = owl; class JackUrlImage extends Component { // }; }); |
注册到manifest
1 2 3 4 5 6 7 8 9 | # code:__manifest__.py { ... 'assets' : { 'web.assets_backend' : [ 'jack_url_image/static/src/js/components/JackUrlImage.js' , ] }, } |
三:为组件创建并注册模板 xml
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/8f398ad9949cac64ef7cd1c04444e6fa1e81bb3e
一般情况下,我们的xml和js是同名的,创建JackUrlImage.xml
1 2 3 4 5 6 7 8 | <?xml version= "1.0" encoding= "UTF-8" ?> <!--code:myaddons\jack_url_image\ static \src\js\components\JackUrlImage.xml--> <templates xml:space= "preserve" > <!-- xml:space= "preserve" 所有定义的空白字符也要保留--> <t t-name= "jack_url_image.JackUrlImage" owl= "1" > <div>My cool new widget</div> </t> </templates> |
注册到我们的js
1 2 3 4 5 6 7 8 9 10 11 12 13 | // code:myaddons/jack_url_image/static/src/js/components/JackUrlImage.js odoo.define( "jack_url_image.JackUrlImage" , function (require) { const {Component} = owl; class JackUrlImage extends Component { // }; Object.assign(JackUrlImage, { //新加内容 template: "jack_url_image.JackUrlImage" // 新加内容 }); // 新加内容 }); |
注册到manifest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # -*- coding: utf-8 -*- # code:__manifest__.py { ...... 'assets' : { 'web.assets_backend' : [ 'jack_url_image/static/src/js/components/JackUrlImage.js' , ], "web.assets_qweb" : [ "jack_url_image/static/src/js/components/JackUrlImage.xml" , ], }, "data" : [ "url_image.xml" , ], } 第一遍错误,因为教程是 14 的,我在 15 做,写法有改变。 代码在后面的推送改了。 |
四:更新依赖项
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/3a31b01dcb29dfd78ec07281cee5e515740be6a7
这个就看你想用在什么地方了,参考教程是装在销售报价单,所以依赖"depends": ["sale", "sale_management"],
我想用在hr员工模块下,所以我改依赖hr
1 2 3 4 5 6 7 | # -*- coding: utf-8 -*- # code:__manifest__.py { ...... 'depends' : [ 'base' , 'hr' ], #修改这里 .... } |
五:覆盖表单渲染器以将组件安装到类
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/df595427e9c7177d00961879932a568f6003e0d7
我们将更新我们的js
文件以扩展核心 Odoo 表单渲染器以查找某个 html 类并自动将我们的组件安装到该元素。
继承自:odoo/addons/base/static/src/js/res_config_settings.js 定义的
1 2 3 4 5 6 7 8 | var BasicModel = require( 'web.BasicModel' ); var core = require( 'web.core' ); var FormView = require( 'web.FormView' ); var FormController = require( 'web.FormController' ); var FormRenderer = require( 'web.FormRenderer' ); var view_registry = require( 'web.view_registry' ); const Dialog = require( 'web.Dialog' ); 先记下来,用到的时候就方便理解了。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // code:myaddons/jack_url_image/static/src/js/components/JackUrlImage.js ...... FormRenderer.include({ async _render() { await this ._super(...arguments); for (const element of this .el.querySelectorAll( ".o_jack_url_image" )) { ( new ComponentWrapper( this , JackUrlImage)) .mount(element) } } }); }); 尽管提示错误,目前还没报错。 |
六:将 div 添加到需要显示的地方
源码内容:https://github.com/jackadam1981/Odoo_owl_widge/commit/c8c1d2f66a3c96552040f47dae2829f08faa98df
创建view.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version= "1.0" encoding= "utf-8" ?> <!--code:myaddons/jack_url_image/url_image.xml--> <odoo> <data> <record id= "url_image" model= "ir.ui.view" > <field name= "name" >hr.employee.inherit.form</field> <field name= "model" >hr.employee</field> <field name= "inherit_id" ref= "hr.view_employee_form" /> <field name= "arch" type= "xml" > <field name= "category_ids" position= "after" > <h2> <div class = "o_jack_url_image" colspan= "2" /> </h2> </field> </field> </record> </data> </odoo> |
注册到注册到manifest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # -*- coding: utf-8 -*- # code:__manifest__.py { ...... 'assets' : { 'web.assets_backend' : [ 'jack_url_image/static/src/js/components/JackUrlImage.js' , ], "web.assets_qweb" : [ #15改这里注册了,参考教程是14的,写法不一样 "jack_url_image/static/src/js/components/JackUrlImage.xml" , ], }, "data" : [ "url_image.xml" , ], } |
七:扩展我们的widget
最困难的已经解决了
现在是需要引入自己的JS,来渲染界面了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下