在之前的一篇文章中,说明了怎么在 创建/导入/编辑 等按钮后自定义一个功能性按钮。 ODOO 自定义按钮【基于odoo12,odoo13】,在这篇的文章中,我忘记把JS处理的部分贴出来,所以我决定把这个再完善一下。
本篇是基于ODOO13开发教程【蛋挞王子的噩梦】,对上篇文章进行的补充和修改,主要是说明下面这2个问题要怎么处理。
第一个问题,这个问题说到底是一个判断并显示隐藏的处理。
方案一:我最开始的解决办法是在JS中,判断当前模型是不是想要显示button的模型(在本篇文章中,这个模型名为 zerone.book),根据判断结果将自定义button的属性进行显示或隐藏。
先放一下 static/src/xml/xxxxxxxxxxx.xml 中的 button 代码:
注意:在上面的代码中,我加了个 style = "display:none;" ,为的是让这个按钮隐藏,只有经过JS的处理后,改变这个display的值,再让按钮显示。接下来是JS处理:
ListController.include({
init: function () {
this._super.apply(this, arguments);
ImportControllerMixin.init.apply(this, arguments);
},
renderButtons: function () {
this._super.apply(this, arguments);
ImportControllerMixin._bindImport.call(this);
let model_name = this.modelName;
if (model_name === "zerone.book") {
if (this.selectedRecords.length > 0) {
$(".o_button_send_to").prop("style", "display:inline-block");
}
else {
$(".o_button_send_to").prop("style", "display:none");
}
}
}
});
这样通过model_name决定这个按钮是否要显示出来。
方案二:后来Qweb了解的多了,也有想过在xml中,使用 t-if 判断当前模型,但一直没有这方面的需求,就搁置了。直到上篇文章评论区的一个大哥,提出了这么个建议。
放一下xml中控制的代码:
通过 t t-if 判断当前模型,从而决定显示隐藏。
方案三:单独写一个小部件Widget,渲染按钮,这个方案是在我做了自定义仪表板页面(Qweb)之后,有过思考的一个方案。
2020-06-04 更新 ,参考 ODOO13 有同志留言,想看看QWEB渲染widget实现自定义按钮。今天,他来撩
第二个问题,这个问题的解决,我是参考了动作/打印按钮显隐的实现。
只有在有勾选记录的时候,才将我们自定义的按钮显示出来,参考动作/打印按钮。我发现js中有一个名为 _toggleSidebar的方法,我们可以把这个方法继承出来,把模型判断这一步补充进去。
_toggleSidebar: function () {
if (this.sidebar) {
this.sidebar.do_toggle(this.selectedRecords.length > 0);
}
let model_name = this.modelName;
if (model_name === "zerone.book") {
if (this.selectedRecords.length > 0) {
$(".o_button_send_to").prop("style", "display:inline-block");
}
else {
$(".o_button_send_to").prop("style", "display:none");
}
}
},
第三个问题,这个问题我曾在 xml 文件中,尝试添加groups,但是没有起作用,我猜测可能是我button
上的style影响了,但是不太可能,于是我在JS中进行的处理,在上面代码中,我增加了一步权限组的判断。
_toggleSidebar: function () {
var self = this;
if (this.sidebar) {
this.sidebar.do_toggle(this.selectedRecords.length > 0);
}
var access_mark = false;
let model_name = this.modelName;
var group_list = new Array("base.group_user", "xxx.group_xxx_admin", "xxx.group_xxx_user");
for (var i = 0; i < group_list.length; i++) {
session.user_has_group(group_list[i]).then(function (has_group) {
if (has_group) {
access_mark = true;
if (model_name === "zerone.book" && access_mark) {
if (self.selectedRecords.length > 0) {
$(".o_button_send_to").prop("style", "display:inline-block");
}
else {
$(".o_button_send_to").prop("style", "display:none");
}
}
}
});
if (access_mark) break;
}
},
上面判断用户是否有某个权限,是异步执行的,这里写代码时要注意。写完之后,功能虽实现了,但我觉得我的JS,尤其是对异步处理的这一块,太TM烂了,有懂的,来给我优化一下,贴在评论区吧。
最后,第二个问题中的方案三,用自定义Widget 去实现增加按钮的功能,完全可以实现。以后会完善的。