在Odoo開發中,ref
是一個非常重要的函式,用於在XML檔案中引用其他資料的ID,幫助我們快速定位和呼叫系統中已經存在的記錄。ref
的全稱是reference
,可以透過該函式引用特定的檢視、欄位、模型等元素,從而在模組開發中實現跨檔案、跨模組的引用。下面我會詳細解釋ref
的作用,並提供豐富的示例,幫助你更好地理解和掌握它。
1. 基本語法
ref
的基本語法是<field name="field_name" ref="module_name.xml_id"/>
,其中:
field_name
:欄位的名稱,用於指定需要引用的位置。module_name.xml_id
:模組名和XML ID的組合。module_name
是所引用物件的所屬模組,xml_id
是該物件的XML ID。
2. ref
的基本用法示例
示例1:引用檢視
在Odoo中可以使用ref
引用一個檢視。假設我們需要在自定義模組中使用purchase
模組中的某個檢視:
<field name="view_id" ref="purchase.purchase_order_tree"/>
這裡,purchase
是模組名稱,purchase_order_tree
是該模組中檢視的XML ID。這段程式碼用於引用purchase
模組中的採購訂單樹狀檢視。
示例2:引用選單項
當我們需要引用另一個模組的選單項時,可以使用ref
。假設我們需要引用account
模組中的會計選單:
<field name="menu_id" ref="account.menu_finance_accounting"/>
在這裡,account.menu_finance_accounting
代表account
模組中的會計選單項。
示例3:引用操作(action)
有時我們需要引用另一個模組中的操作(action
),例如在自定義模組中引用hr
模組中的僱員表單檢視操作:
<field name="action" ref="hr.open_view_employee_form"/>
這段程式碼表示引用hr
模組中的僱員表單檢視操作。
3. 常見用法場景
場景1:設定預設檢視
在Odoo中建立一個新選單項,並讓它開啟一個特定檢視。我們可以使用ref
來設定預設檢視。例如:
<record id="menu_my_custom_view" model="ir.ui.menu"> <field name="name">我的自定義檢視</field> <field name="parent_id" ref="base.menu_custom"/> <field name="action" ref="my_module.action_my_custom_view"/> </record>
這裡,我們建立了一個新的選單項menu_my_custom_view
,並使用ref
引用一個自定義的操作action_my_custom_view
。這將開啟指定的檢視。
場景2:引用安全組
在Odoo的許可權控制中,可以透過ref
為不同的操作分配使用者許可權。例如:
<record id="model_my_model_rule" model="ir.rule"> <field name="name">訪問我的模型</field> <field name="model_id" ref="model_my_model"/> <field name="groups" eval="[(4, ref('my_module.group_my_custom_group'))]"/> </record>
這裡透過ref
引用了一個安全組group_my_custom_group
,該安全組允許特定使用者訪問模型my_model
。
場景3:引用欄位
如果需要在程式碼中引用某個欄位,可以使用ref
。假設我們需要引用res.partner
模型中的customer
欄位:
<field name="field_name" ref="base.field_res_partner__customer"/>
這會引用base
模組中res.partner
模型的customer
欄位。這種引用方式通常用於欄位的繼承或擴充套件。
場景4:引用資料記錄
我們還可以使用ref
引用特定資料記錄。例如,在為某個產品設定預設分類時,可以使用ref
引用分類ID:
<field name="categ_id" ref="product.product_category_all"/>
這裡引用了product
模組中的一個產品分類product_category_all
。
4. ref
的高階用法
高階示例1:動態檢視引用
有時,我們需要根據某些條件動態引用不同的檢視。可以透過ref
結合if
條件實現。
<field name="view_ids" eval="[(0, 0, {'view_mode': 'tree', 'view_id': ref('module.view_tree')}), (0, 0, {'view_mode': 'form', 'view_id': ref('module.view_form')})]"/>
這段程式碼會在檢視模式為樹和表單時,動態引用不同的檢視ID。
高階示例2:設定繼承檢視的父檢視
在Odoo中建立繼承檢視時,需要指定父檢視。可以使用ref
來引用父檢視。例如:
<record id="inherit_purchase_order_form" model="ir.ui.view"> <field name="name">purchase.order.form.inherit</field> <field name="model">purchase.order</field> <field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='partner_id']" position="after"> <field name="custom_field"/> </xpath> </field> </record>
這裡inherit_id
使用ref
引用了purchase
模組中的purchase_order_form
表單檢視,並在partner_id
欄位後新增了custom_field
欄位。
高階示例3:動態設定預設值
在建立記錄時,可以透過ref
為欄位設定預設值。例如,在建立採購訂單時,可以透過ref
為供應商欄位設定預設供應商:
<record id="purchase_order_default" model="purchase.order"> <field name="partner_id" ref="base.res_partner_1"/> </record>
這裡引用了base
模組中的供應商res_partner_1
,作為採購訂單的預設供應商。
5. 注意事項
ref
只能引用已經定義的XML ID,因此引用的ID必須在被引用之前存在。- 如果跨模組引用,確保模組依賴關係已正確定義,否則會導致引用失敗。
- 使用
ref
時,注意ID的拼寫準確,因為錯誤的ID會導致系統錯誤。
總結
ref
是Odoo開發中不可或缺的一個工具,它能幫助我們在不同的模組和檔案中引用已有的記錄、檢視、欄位等。無論是簡單的檢視引用,還是高階的許可權控制和繼承配置,ref
都可以使我們的開發過程更加便捷、高效。