Odoo8在TreeView左上角增加自定义按钮以及通过继承生成自定义的View_Mode

助顶:http://blog.csdn.net/vnsoft/article/details/49621373

今天有网友在问怎么在TreeView左上角增加一个自定义的按钮,在查询Odoo 自带的模块,发现在purchase_requisition中有使用,并且此模块还应用到了自定义View_Mode的情况,所以今天拿出来分析一下,有兴趣的童鞋可以参考说明去模块中查看详细内容。

首先模块显示的效果如下图:


这个是在招标单中,如果一个产品有多个询价单,则在完成招标单时,系统会显示此界面,需要你确认一个最终有效的询价单,这个界面需要打开配置参数中如下图所示的项目才会有显示。


仔细分析源码,这个View的定义是在purchase_requisition_view.xml中,主要内容如下:

  1. <record id="purchase_order_line_tree_tender" model="ir.ui.view">  
  2.        <field name="name">purchase.order.line.tree.tender</field>  
  3.        <field name="model">purchase.order.line</field>  
  4.        <field eval="1" name="priority"/>  
  5.        <field name="arch" type="xml">  
  6.            <tree string="Purchase Order Lines" create="false" colors="blue:state == 'confirmed';gray:state == 'cancel'">  
  7.                <field name="name"/>  
  8.                ......  
  9.            </tree>  
  10.        </field>  
  11. </record>  
然后为这个View定义了一个动作,主要内容如下:
  1. <record id="purchase_line_tree" model="ir.actions.act_window">  
  2.             <field name="name">Bid Lines</field>  
  3.             <field name="res_model">purchase.order.line</field>  
  4.             <field name="context">{"search_default_groupby_product" : True,}</field>  
  5.             <field name="view_type">form</field>  
  6.             <field name="view_mode">tree_purchase_order_line_compare</field>  
  7.             <field name="view_id" ref="purchase_order_line_tree_tender"/>  
  8.             <field name="search_view_id" ref="purchase.purchase_order_line_search"/>  
  9.     </record>  

主要看上面动作的定义中,view_mode节点是放的tree_purchase_order_line_compare,与普通的tree,form是不一样的,这个新的view_mode是哪里来的呢?

我们继续来看addons/purchase_requisition/static/src/js/web_addons.js中的内容,其中有一段主要内容如下:

[javascript] view plain copy
  1. instance.web.views.add('tree_purchase_order_line_compare''instance.web.purchase_requisition.CompareListView');  
  2. instance.web.purchase_requisition.CompareListView = instance.web.ListView.extend({  
  3.     init: function() {  
  4.         var self = this;  
  5.         this._super.apply(this, arguments);  
  6.         this.on('list_view_loaded'thisfunction() {  
  7.             if(self.__parentedParent.$el.find('.oe_generate_po').length == 0){  
  8.                 var button = $("<button type='button' class='oe_button oe_highlight oe_generate_po'>Generate PO</button>")  
  9.                     .click(this.proxy('generate_purchase_order'));  
  10.                 self.__parentedParent.$el.find('.oe_list_buttons').append(button);  
  11.             }  
  12.         });  
  13.     },  
  14.     generate_purchase_order: function () {  
  15.         var self = this;  
  16.         new instance.web.Model(self.dataset.model).call("generate_po",[self.dataset.context.tender_id,self.dataset.context]).then(function(result) {  
  17.             self.ViewManager.ActionManager.history_back();  
  18.         });  
  19.     },  
  20. });  

这里第一行add方法就是把一个新的view_mode名称跟一个自定义的instance.web.purchase_requisition.CompareListVIew关联起来,新的view_mode是继承自web.ListView,所以具备原来的ListView所有属性和方法定义。在新的view_mode的init方法,通过jQuery新加了一个button,并且指定该按钮的点击事件响应generate_purchase_order方法,这个方法就在如下面有定义,在这个方法中触发了purchase_requisition.py中的generate_po方法,在执行完以后并回退到原来打开此view的页面。

以上内容包括了js增加自定义按钮,并响应py中的方法流程,并且也运用了view_mode的继承,为自定义更丰富的view提供了参考。

最后顺便记录一下打开此视图的代码为:

  1. def open_product_line(self, cr, uid, ids, context=None):  
  2.     """ This opens product line view to view all lines from the different quotations, groupby default by product and partner to show comparaison 
  3.         between supplier price 
  4.         @return: the product line tree view 
  5.     """  
  6.     if context is None:  
  7.         context = {}  
  8.     res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'purchase_requisition''purchase_line_tree', context=context)  
  9.     res['context'] = context  
  10.     po_lines = self.browse(cr, uid, ids, context=context)[0].po_line_ids  
  11.     res['context'] = {  
  12.         'search_default_groupby_product'True,  
  13.         'search_default_hide_cancelled'True,  
  14.         'tender_id': ids[0],  
  15.     }  
  16.     res['domain'] = [('id''in', [line.id for line in po_lines])]  
  17.     return res 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值