在Odoo開發中,ref是一個非常重要的函式,用於在XML檔案中引用其他資料的ID,幫助我們快速定位和呼叫系統中已經存在的記錄。

*感悟人生*發表於2024-11-13

在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都可以使我們的開發過程更加便捷、高效。

相關文章