ODOO13 有同志留言,想看看QWEB渲染widget实现自定义按钮。今天,他来撩

有同志留言,想看看Widget实现自定义按钮。今天,他来撩。


Odoo生态系统的一个常见需求是从外部扩展/更改基本系统的行为(通过安装应用程序,即不同的模块)。例如,可能需要在某些视图中添加新的小部件类型。在这种情况下,以及其他许多情况下,通常的过程是创建所需的组件,然后将其添加到注册表(注册步骤),以使Web客户机的其余部分知道它的存在。

在系统中可用的注册有:

  • 字段注册表(由“web.field_registry”导出),字段注册表包含Web客户端已知的所有字段小部件。
  • 视图注册表(由“web.view_registry”导出),此注册表包含Web客户端已知的所有JS视图,(尤其是视图管理器)。
  • 动作注册表:我们跟踪此注册表中的所有客户端动作。这个是动作管理器在需要创建客户端操作时查找的位置。

在这一篇中,我们需要用到视图注册表。从严格意义上,这篇实现并不能属于widget的实现,应该算是QWEB渲染部分的知识,但其实践方法,与odoo12(不含odoo12)中小部件widget的实践方式几乎一模一样。

本文参考odoo自带模块account的源码,基于ODOO13开发教程【蛋挞王子的噩梦】的代码,实现QWEB渲染自定义按钮。


一  创建 static/src/xml/view_button.xml 并在 _manifest__.py 的qweb 中引用


二 创建 static/src/js/extend_view_button.js

odoo.define('zerone.book.tree', function (require) {
    "use strict";

    var ListController = require('web.ListController');
    var ListView = require('web.ListView');
    var viewRegistry = require('web.view_registry');

    var ZeroneBookListController = ListController.extend({
        buttons_template: 'ZeroneBook.buttons',
        events: _.extend({}, ListController.prototype.events, {
            'click .o_button_send_test': '_onButtonSend',
        }),
        _onButtonSend: function () {
            // TODO 按钮事件
            console.log("我来撩!");
        }
    });

    var ZeroneBookListView = ListView.extend({
        config: _.extend({}, ListView.prototype.config, {
            Controller: ZeroneBookListController,
        }),
    });

    viewRegistry.add('zerone_book_tree', ZeroneBookListView);
});

第九行渲染了一个按钮的模板,这个模板是在第一步中定义的。第十行增加了事件,监听按钮被点击。第十三行是按钮事件的处理函数,函数中的处理,请参考 之前的文章 ODOO13 JS 自定义按钮后续来了

 三  创建 views/extend_view_assets.xml ,并在 _manifest__.py 的data 中引用



    
        
    

 到这一步,已经实现了99.99%了。这时的代码安装上,虽不会报错,但是没有效果的。还差最后一步,也是最重要的一步。

四  使用我们注册的JS视图

在第二步中,我们使用 web.view_registry 视图注册表,将我们的按钮模板ZeroneBook.buttons 渲染并注册了。viewRegistry.add('zerone_book_tree', ZeroneBookListView); 在这里 add 接收两个参数,第一个参数是部件名,当我们要使用这个部件时,需要调起这个部件名。第二个参数是对ListView的继承,也就是当我调用部件名的时候,执行的是ZeroneBookListView的这部分。

那么,怎么使用注册的视图?很简单。在你的xml中,为列表视图的tree标签增加一个名为 js_class 的属性,属性值即为部件名。在本篇的例子中,我是依赖于另一个模块zerone_books,而且我要增加按钮的模型是zerone.book,他的视图已经出现在zerone_books模块中,所以我在当前模块中对zerone.books的列表视图进行了继承。

创建 views/_inherit_zerone_book.xml 


    zerone_book_tree

我们这样做,就不需要写JS或者XML,根据判断当前模型,决定按钮的显示隐藏了。但是我在按钮上增加了groups,试图(妄想)根据权限显示隐藏,似乎也没有起作用。不知道是我的代码写错了,还是本就不支持。有成功经验的同学,在下方留言吧,共同学习。

这篇的实现,没有解决【ODOO13 JS 自定义按钮后续来了】文章中的 第二、三个问题。具体请参考这篇文章吧。

蛋挞的噩梦,最新代码:https://github.com/lwdsw/odoo13_danta

 

你可能感兴趣的:(有同志留言)