描述
简单来说客户端动作通过注册一组widget,来绑定特定的action.
从服务器的角度来看客户端动作仅仅是 ir_action模型中保存的一条记录;从Web客户端角度来看,他是一个继承自AbstractAction类的小部件(widget)。
使用客户端动作前需要在注册表中进行注册(core.action_registry.add(’’, ‘’))
var AbstractAction = require('web.AbstractAction');
var core = require('web.core');
var TongjiPage = AbstractAction.extend({
template: 'MainTongjiPage',
init: function(){
return this._super.apply(this, arguments);
},
}),
客户端动作的注册
首先我们需要web客户端和TongjiPage 的映射
core.action_registry.add('tongji.page.main', TongjiPage);
然后,我们需要多在ir.actions.client中定义一条tag属性为tongji.page.main的记录
<record id="action_tongji_page" model="ir.actions.client">
<field name="name">统计</field>
<field name="tag">tongji.page.main</field>
</record>
## 控制面板(ControlPanelMixin) 那么问题来了什么是控制面板?
如下图 的红色框框区域↓↓↓
那么在我们自定义的界面如何添加odoo 默认的控制面板呢?首先要知道的是默认AbstractAction类是不支持控制面板的。
在新增的Widget中添加控制面板的格式如下:
var ControlPanelMixin = require('web.ControlPanelMixin');
var TongjiPage = AbstractAction.extend(ControlPanelMixin, {
template: 'MainTongjiPage',
init: function(){
return this._super.apply(this, arguments);
},
}),
每次更新控制面板时需要调用_updateControlPanel方法(官方示例):
var SomeClientAction = Widget.extend(ControlPanelMixin, {
...
start: function () {
this._renderButtons();
this._updateControlPanel();
...
},
do_show: function () {
...
this._updateControlPanel();
},
_renderButtons: function () {
this.$buttons = $(QWeb.render('SomeTemplate.Buttons'));
this.$buttons.on('click', ...);
},
_updateControlPanel: function () {
this.update_control_panel({
cp_content: {
$buttons: this.$buttons,
},
});