ODOO13 JS 自定义按钮后续来了

在之前的一篇文章中,说明了怎么在 创建/导入/编辑 等按钮后自定义一个功能性按钮。 ODOO 自定义按钮【基于odoo12,odoo13】,在这篇的文章中,我忘记把JS处理的部分贴出来,所以我决定把这个再完善一下。

本篇是基于ODOO13开发教程【蛋挞王子的噩梦】,对上篇文章进行的补充和修改,主要是说明下面这2个问题要怎么处理。

  1. 这样加的话,在每个视图都会显示这个按钮,怎么办?
  2. 想让自定义的按钮只在勾选了记录的情况下才显示,怎么办?
  3. 不仅要在勾选了记录后显示,还需要根据权限决定显示还是隐藏,怎么办?

第一个问题,这个问题说到底是一个判断并显示隐藏的处理。

方案一:我最开始的解决办法是在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 去实现增加按钮的功能,完全可以实现。以后会完善的。

你可能感兴趣的:(ODOO13,JavaScript,odoo)