zoukankan      html  css  js  c++  java
  • odoo12 列表视图新增自定义按钮实现不同的业务需求

    odoo12 列表视图新增自定义按钮实现不同的业务需求

    场景:

      一个神奇的需求吧,算是,列表页创建表单数据的时候,通过type控制数据的不同,但是说为了防止用户误操作,需要把原来odoo自带的创建按钮去掉,做成两个不同的创建入口(入库创建按钮、出库创建按钮)附图一张。

       然后就是做成弹窗样式的数据,没有常规操作点击列表数据进入form视图的操作。

    思路:

      用xml继承模板写按钮,然后通过js来获取按钮的点击与否,再写业务逻辑

     按钮添加参考这篇:https://blog.csdn.net/Katherine130/article/details/103457644

    js打开form参考这篇:https://www.cnblogs.com/da-tong/p/13029686.html

    代码实现:

      1. 首先在static下的src文件夹下的xml文件夹里面新建一个按钮的模板out_in_stock_btn_template.xml(记得在__manifest__文件里面引入qweb)

    <?xml version="1.0" encoding="UTF-8"?>
    <templates>
    <!--    Tree 视图上自定义按钮-->
        <t t-name="OutInStockBtnView.in_stock_button">
            <button type="button" class="btn btn-primary in_stock_btn" style="border-radius: 5px">
                新增入库
            </button>
        </t>
        <t t-name="OutInStockBtnView.out_stock_button">
            <button type="button" class="btn btn-primary out_stock_btn" style="margin-left: 10px;border-radius: 5px">
                新增出库
            </button>
        </t>
        <t t-name="OutInStockBtnView.carry_last_month_stock">
            <button type="button" class="btn btn-primary last_month_stock" style="margin-left: 200px;border-radius: 5px">
                结转上月库存
            </button>
        </t>
    
        <t t-extend="ListView.buttons" t-name="OutInStockBtnView.out_in_stock_button">
            <t t-jquery="div.o_list_buttons" t-operation="append"> <!-- t-jquery 根据页面布局自行填写 -->
                <t t-call="OutInStockBtnView.in_stock_button"/>
                <t t-call="OutInStockBtnView.out_stock_button"/>
                <t t-call="OutInStockBtnView.carry_last_month_stock"/>
            </t>
        </t>
    </templates>

       2. 新建一个瞬时模型和form视图,用来在点击了自定义按钮后弹出页面(记得在__manifest__文件引入)

           我的页面就是这样

      

     ·弹窗的保存按钮:

    <button string="保存" type="object" name="execute" class="oe_highlight"/>

      3. 对应瞬时模型对应保存按钮方法

    @api.multi
        def execute(self):
            """新增入库"""
            pass

      4. static下的src下js文件夹新建out_in_site_usage.js文件(为自定义按钮绑定事件,触发功能)

    odoo.define('fr.off.site.usage', function (require) {
        "use strict";
    
        let Dialog = require('web.Dialog');
        let core = require('web.core');
        let ListController = require('web.ListController');
        let ListView = require('web.ListView');
        let rpc = require('web.rpc');
        let viewRegistry = require('web.view_registry');
        let qweb = core.qweb;
    
        let FrOffSiteUsage = ListController.extend({
            buttons_template: 'OutInStockBtnView.out_in_stock_button',
            renderButtons: function () {
                this._super.apply(this, arguments);
                if (this.$buttons) {
                    var self = this;
                    this.$buttons.on('click', '.in_stock_btn', this.proxy('create_in_stock'));
                    this.$buttons.on('click', '.out_stock_btn', this.proxy('create_out_stock'));
                    this.$buttons.on('click', '.last_month_stock', this.proxy('carry_last_month_stock'));
                }
            },create_in_stock: function () {
    //            this._rpc({
    //                model: "fr.off.site.in.stock.wizard", # 模型名
    //                method: "execute", # 方法名
    //                args: ['in'], # 参数
    //            }).then(function () {
    //                 location.reload();
    //            }); 这是可以直接出发对应模型的方法
                var self = this;
                this.do_action({
                    name: "新增入库",   //自定义弹出框名称
                    type: 'ir.actions.act_window',  //动作类型
                    res_model: 'fr.off.site.in.stock.wizard',    //视图的model
                    views: [
                        // [false, 'list'],
                        [false, 'form'],
                    ],
                    view_mode: "form",
                    view_type: 'form',
                    view_id: 'fr_storage_extend.FrOffSiteInStockWizardAction',    //视图的id
                    context: "{'stock': 'in'}",
    //                flags: {'initial_mode': 'view',action_buttons:false},  //target: 'new'弹出框默认为编辑模式,需要只读模式的可以加上这句
                    target: 'new'   //打开方式
                })
            },
    
            create_out_stock: function () {
                alert('点击了新增出库')
            },carry_last_month_stock: function () {
                alert('点击了结转上月库存')
            }
        });
    
    
        let OutInStockBtnView = ListView.extend({
            config: _.extend({}, ListView.prototype.config, {
                Controller: FrOffSiteUsage,
            }),
        });
    
        viewRegistry.add('fr_off_site_usage', OutInStockBtnView);
    
    });

      5.  js文件引入(此xml文件也要记得引入)

    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
        <data>
    
            <template id="FrStorageExtend" name="FrStorageExtendReportKanBanExtend assets" inherit_id="web.assets_backend">
                <xpath expr="." position="inside">
                    <script type="text/javascript" src="/fr_storage_extend/static/src/js/out_in_site_usage.js"/>
                </xpath>
            </template>
    
        </data>
    </odoo>
  • 相关阅读:
    c# 获取iis地址
    c# 导入导出Excel
    ffmpeg 转成MP3采样率8000
    c# 百度api语音识别
    c# 文件转换成base64
    js截取文件的名称
    js checkbox获取选中的值
    js base64位和c# Base64位转换
    笨方法学Python——习题16
    Python学习问题
  • 原文地址:https://www.cnblogs.com/pywjh/p/13396800.html
Copyright © 2011-2022 走看看