微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在树视图 Odoo 13 之外添加按钮 调用模型方法调用操作

如何解决在树视图 Odoo 13 之外添加按钮 调用模型方法调用操作

美好的一天!

有没有办法在 odoo 的树视图上方添加一个按钮?
每当用户单击按钮时,我想运行一个函数
如果这是不可能的,你能帮我找到一个替代方案吗?

这是我正在查看的代码

var listofDataMapped = DbContext.Database.sqlQuery<Something2>(@" SELECT  
                        [Extent1].id Id,[Extent1].name Name,[Extent2].id [Something1.Id],[Extent2].name [Something1.Name]
                        .
                        .
                        .

解决方法

好吧,这是我在树视图中获取按钮的尝试。我会一步一步为您解释清楚。

首先我们必须通过qweb将按钮添加到树视图中,从web模块继承树视图。 这将使我们的新按钮出现在我们不想要的所有树视图中。因此,为了避免这种情况,我们添加了一个条件 t-if='widget.modelName == "account.payment.import"',这将导致仅为模型是我们感兴趣的视图的视图生成按钮。我们还添加了一个 CSS 类 oe_new_custom_button 以便能够从 javascript 中识别按钮。

让我们调用包含此 qweb 的文件 tree_view_button.xml 并将其放在 your_module_name/static/src/xml 中。

<?xml version="1.0" encoding="UTF-8"?>

<templates>
    <t t-extend="ListView.buttons">
        <t t-jquery="div.o_list_buttons" t-operation="append">
            <button type="button" t-if='widget.modelName == "account.payment.import"'
                    class="oe_new_custom_button btn btn-primary">Custom Button
            </button>
        </t>
    </t>
</templates>

其次,我们必须为按钮提供功能,我们通过 javascript 实现这一点。

这里我们继承了树视图控制器,称为 ListController,它的作用是渲染和绑定控制面板中所有额外的按钮/分页器等。

让我们调用包含此 javascript tree_view_button.js 的文件并将其放置在 your_module_name/static/src/js 中。

odoo.define('your_module_name.tree_view_button',function (require){
    "use strict";

    var ajax = require('web.ajax');
    var ListController = require('web.ListController');

    ListController.include({
        renderButtons: function($node) {
            this._super.apply(this,arguments);
            var self = this;
            if (this.$buttons) {
                $(this.$buttons).find('.oe_new_custom_button').on('click',function() {
                    //custom code
                });
            }
        },});
});

最后,我们将 javascript 添加到 odoo 资产并配置清单以接受我们所有的更改。

让我们调用包含资产的文件 assets.xml 并将其放在 your_module_name/views 中。

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data>
        <template id="assets_backend" name="your_module_name_assets" inherit_id="web.assets_backend">
            <xpath expr="." position="inside">
                <script type="text/javascript" src="/your_module_name/static/src/js/tree_view_button.js"></script>
            </xpath>
        </template>
    </data>
</odoo>

这就是 ma​​nifest.py 的样子。

{
    'data': [
        [ ... ]
        'views/assets.xml',# <- important
    ],"qweb": ['static/src/xml/*.xml'],# <- important
}

我们已经拥有了一切,但是现在,javascript 还能做什么?

所有内容都有一点,但最重要的是以下内容。

调用模型方法

odoo.define('your_module_name.tree_view_button',function (require){
    "use strict";

    var ajax = require('web.ajax');
    var ListController = require('web.ListController');

    var rpc = require('web.rpc')

    ListController.include({
        renderButtons: function($node) {
            this._super.apply(this,function() {
                    rpc.query({
                        model: 'account.payment.import',method: 'some_method',args: [],}).then(function(res){
                        // console.log(res)
                        // self.reload();
                    })
                });
            }
        },});
});

args 的第一个参数是您希望出现在 some_method 的 self 变量中的 id 列表。

调用操作

odoo.define('your_module_name.tree_view_button',function() {
                    self.do_action('model_name.action_id',{
                        additional_context: {},});
                });
            }
        },});
});

additional_context 应该是,例如,

{
    'active_id': 1,}

结束

就是这样,我希望它对你有用。我附上了按钮外观的图片。

button

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。