题目虽然是颜色选择器使用,但是本篇小黄文会涉及到玉女心经…
咳咳, 本篇技术文章涉及到一些重要的姿势,某些看官一直要求我讲一讲有关js方面的姿势。
那么本篇大概会出现自定义Widget、Tree视图的渲染等姿势。
某些看官(尤其’小萝卜头’…)就不要那么吝啬了,1分钱都不够手机流量费。
那下面就正式开始
颜色选择器的使用
Odoo 中关于颜色选择器的使用,有很多例子。这里就以产品属性为例子。
下面是定义了一个彩虹屁的属性,并在属性中设置了相关属性值
在创建属性值得时候,点击颜色时,会弹出一个颜色选择器的界面。如下
那么,这是如何实现的呢?进入下一个环境,剥丝抽茧,揭开神秘面纱。
揭开选择器面纱
我们查看代码,发现字段定义如下。
在py文件中:
1 | html_color = fields.Char( |
在xml文件中:
1 | <field name="html_color" attrs="{'column_invisible': [('parent.display_type', '!=', 'color')]}" widget="color"/> |
由此可见,该字段是一个Char
类型的字段,并且使用了一个color
的Widget
。
因此我们回归到问题, 这个color
是什么玩意儿?我能自定义吗?
color插件的定义
文件路径: odoo\addons\web\static\src\js\fields\field_registry.js
源码:
1 | registry |
发现是在此处,将basic_fields.FieldColor
注册成为一个名为color
的widget插件
继续跟踪basic_fields.FieldColor
文件路径: odoo\addons\web\static\src\js\fields\basic_fields.js
源码:
1 | var FieldColor = AbstractField.extend({ |
我们发现,该插件使用的模板是FieldColor
。继续查看FieldColor
模板定义。
文件路径: \odoo\addons\web\static\src\xml\base.xml
源码:
1 | <t t-name="FieldColor"> |
至此,我们已经扒开了color
这个widget
的层层伪装了。
首先是定义了一个模板FieldColor
。而模板中定义了一个button按钮,并且class属性为o_field_color
(这很关键)
其次在js中对AbstractField
这个抽象字段插件进行了扩展。
扩展步骤:
一、引入模板 使用 template: 'FieldColor'
二、定义相关事件
1 | events: _.extend({}, AbstractField.prototype.events, { |
重点, 此步骤(events)将模板中的按钮,绑定了事件。
三、重写render
方法
1 | _render: function () { |
render方法,是渲染字段的方法。在此处就重写渲染字段方法,则会被应用到前端。
小姿势:
在render
方法中,会根据当前单据的打开模式(编辑,只读)会分别执行两个方法。_renderEdit
和 readonly
(重点)。以后自定义可重写这两个方法。
1 | if (this.mode === 'edit') { |
四、点击事件执行_onColorClick方法。
1 | _onColorClick: function () { |
可以看到在点击事件中这是创建并打开了一个颜色选择器的对话框。
五、关闭对话框事件_onColorpickerSaved方法。
此事件是自定义事件custom_events
中的
1 | _onColorpickerSaved: function (ev) { |
到此为止,整个color
插件的定义过程就是这样。
姿势就这些,那么接下来就是学以致用了。进入实战环节。
姿势实战
场景一:点击字段时候,弹出颜色选择器,给字段设置相关背景颜色。
裸体代码,如下:
1 |
|
耕耘收获:
场景二: 给float类型字段,设置千分符
裸体代码,如下:
1 | var basic_fields = require('web.basic_fields'); |
在xml中,给float
字段添加一个widget="toExponential"
场景三: 在Tree视图中,给某些字段加上颜色区分(列区分,非行区分)。比如金额大于0的显示蓝色,小于0的显示红色。(红蓝发票)
1 | ... |
以上。
先了解,再找准,再开发。
– end –
看官,别吝啬啦!