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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM