openSOURCE

openSOURCE

Did You Know?

All the tech in one platform

XML — views & data deklaratif

Cara Menggunakan XPath di XML Odoo

Estimated reading: 7 minutes 33 views
Dokumen ini kita rancang sebagai rujukan cepat dan rapi untuk peserta OdooCamp mengenai cara menggunakan xpath pada view XML Odoo 18 (inheritance). Seluruh contoh siap copy‑paste.

Ringkasan Singkat

  • xpath dipakai untuk menyisipkan, memindahkan, mengganti, atau mengubah atribut elemen pada view yang kita warisi (inherit_id).
  • Ada 5 posisi inti: inside, after, before, replace, attributes.
  • Target elemen kita pilih dengan ekspresi XPath pada atribut expr.
  • Jika target tidak ditemukan, Odoo gagal memuat view (error element cannot be located). Pastikan selektornya kokoh.

Anatomi Dasar View Inherit

<record id="view_partner_form_inherit_x" model="ir.ui.view">
    <field name="name">res.partner.form.inherit.x</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_form"/>
    <field name="arch" type="xml">
        <!-- tulis xpath di sini -->
    </field>
</record>

Lima Cara Pemakaian xpath (berdasar position)

1) position="inside" — menyisipkan sebagai anak node target

<xpath expr="//group[@name='contact_details']" position="inside">
    <field name="x_loyalty_code"/>
</xpath>

2) position="after" — menaruh setelah node target (se‑level)

<xpath expr="//field[@name='email']" position="after">
    <field name="x_secondary_email"/>
</xpath>

3) position="before" — menaruh sebelum node target (se‑level)

<xpath expr="//field[@name='phone']" position="before">
    <label for="x_phone_ext"/>
    <field name="x_phone_ext"/>
</xpath>

4) position="replace"mengganti node target sepenuhnya

<xpath expr="//field[@name='website']" position="replace">
    <field name="website" placeholder="https://…"/>
</xpath>

5) position="attributes"ubah/hapus/atur atribut node target

  • Set/replace atribut
<xpath expr="//field[@name='mobile']" position="attributes">
    <attribute name="readonly">1</attribute>
    <attribute name="string">Mobile (Locked)</attribute>
</xpath>
  • Hapus atribut (kosongi isinya)
<xpath expr="//field[@name='mobile']" position="attributes">
    <attribute name="readonly"/>
</xpath>
  • Ubah kelas CSS
<xpath expr="//div[contains(@class,'oe_button_box')]" position="attributes">
    <attribute name="class">oe_button_box o_sample_extra</attribute>
</xpath>
Tips: jika ada banyak match, semua akan diproses. Buat expr unik bila hanya ingin satu titik injeksi.

Contoh Lengkap per Jenis View

A. Form View (res.partner)

Tambah field di tab “Contacts & Addresses”, lalu sembunyikan website.
<record id="view_partner_form_inherit_demo" model="ir.ui.view">
    <field name="name">res.partner.form.inherit.demo</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_form"/>
    <field name="arch" type="xml">
        <!-- 1) inside: tambah field di dalam group -->
        <xpath expr="//page[@name='contacts']/group" position="inside">
            <field name="x_referral_source"/>
        </xpath>

        <!-- 5) attributes: sembunyikan website -->
        <xpath expr="//field[@name='website']" position="attributes">
            <attribute name="invisible">1</attribute>
        </xpath>
    </field>
</record>

B. Tree/List View (res.partner tree)

Sisipkan kolom baru setelah name.
<record id="view_partner_tree_inherit_demo" model="ir.ui.view">
    <field name="name">res.partner.tree.inherit.demo</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_tree"/>
    <field name="arch" type="xml">
        <xpath expr="//tree/field[@name='name']" position="after">
            <field name="x_rank" optional="show"/>
        </xpath>
    </field>
</record>

C. Search View

Tambahkan filter & group by.
<record id="view_partner_search_inherit_demo" model="ir.ui.view">
    <field name="name">res.partner.search.inherit.demo</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_res_partner_filter"/>
    <field name="arch" type="xml">
        <!-- after: tambah filter setelah 'Customers' -->
        <xpath expr="//filter[@name='customer']" position="after">
            <filter name="vip_only" string="VIP Only" domain="[('x_is_vip','=',True)]"/>
        </xpath>

        <!-- inside: tambah group-by di group 'group_by' -->
        <xpath expr="//group[@name='group_by']" position="inside">
            <filter string="By Rank" context="{'group_by':'x_rank'}"/>
        </xpath>
    </field>
</record>

Menulis expr (XPath) yang Kokoh

Gunakan selektor yang stabil dan mudah dipertahankan saat upgrade.
  • Berdasar nama field: //field[@name='amount_total']
  • Berdasar nama page/group: //page[@name='sales'], //group[@name='contact_details']
  • Berdasar class (pakai contains) : //div[contains(@class,'oe_button_box')]
  • Berdasar urutan (hindari jika bisa): (//group)[1], //field[@name='name'][last()]
  • Berdasar teks label (kurang stabil, multibahasa): //label[normalize-space(.)='Email']
Checklist cepat agar expr tidak rapuh:
  • Gunakan atribut yang unik (@name, struktur hierarki jelas).
  • Tambahkan konteks hierarki: //page[@name='sales']//group[@name='totals']//field[@name='taxes'].
  • Beri @name pada elemen yang kita buat agar mudah di-target ulang.

Pola Umum yang Sering Dipakai

1) Ganti satu page dengan versi kustom

<xpath expr="//page[@name='sales']" position="replace">
    <page name="sales" string="Sales">
        <group>
            <field name="x_salesperson_note"/>
        </group>
    </page>
</xpath>

2) “Memindahkan” elemen

Tidak ada position="move". Praktik umum:
  • replace di lokasi lama (hapus/ganti), lalu
  • inside/after/before di lokasi baru (sisipkan ulang versi kustom).

3) Mengatur modifiers (invisible, required, readonly)

<xpath expr="//field[@name='phone']" position="attributes">
    <attribute name="required">1</attribute>
</xpath>

4) Menambah Stat Button di oe_button_box

<xpath expr="//div[contains(@class,'oe_button_box')]" position="inside">
    <button name="action_mark_vip" type="object" class="oe_stat_button" icon="fa-star"
            string="Mark VIP"/>
</xpath>

Diagnostik & Best Practices

  • Aktifkan Developer Mode → buka form → Manage Views untuk menginspeksi struktur final.
  • Jika sering bentrok, buat expr lebih spesifik (tambah konteks parent‑child).
  • Hindari seleksi berdasarkan urutan indeks kecuali sangat terpaksa.
  • Uji pada beberapa record dan modul yang terkait (beberapa view di‑inherit ulang oleh modul lain).

Error Umum & Solusi Cepat

  • Error: element cannot be located → Periksa kembali expr (apakah ID/nama page berubah? modul belum terinstall?).
  • Beberapa elemen berubah sekaligusexpr terlalu umum; spesifikan lagi (tambahkan parent yang unik).
  • CSS berantakan setelah ubah class → pastikan menambahkan kelas yang dibutuhkan, jangan menghapus secara tak sengaja.

FAQ Ringkas

T: Apakah bisa mengubah teks label tanpa mengganti field? J: Bisa, pakai position="attributes" lalu set <attribute name="string">…</attribute> pada label atau field yang bersangkutan. T: Bisakah menambahkan attrs (domain/required/invisible) via xpath? J: Ya, atur di position="attributes" terhadap elemen target dan isi nilai sesuai kebutuhan. T: Bagaimana jika target berada di dalam notebook? J: Seleksi page[@name='…'] terlebih dahulu agar stabil, lalu targetkan group/field di dalamnya. T: Apa langkah aman sebelum deploy? J: Uji di Developer Mode, konfirmasi expr match, dan cek bahwa tidak ada modul lain yang menimpa perubahan kita setelahnya.

Template Siap Pakai

Gunakan pola ini untuk memulai perubahan kecil pada view apa pun.
<record id="${your_view_id}" model="ir.ui.view">
    <field name="name">${model}.inherit.${suffix}</field>
    <field name="model">${model}</field>
    <field name="inherit_id" ref="${module}.${base_view_id}"/>
    <field name="arch" type="xml">
        <xpath expr="${XPATH_TARGET}" position="${inside|after|before|replace|attributes}">
            ${YOUR_CONTENT_OR_ATTRIBUTES}
        </xpath>
    </field>
</record>

Call to Action

Jika peserta OdooCamp butuh bantuan membuat expr yang paling aman untuk kasus konkret, kirimkan:
  1. Potongan XML asal (view yang diinherit),
  2. Tujuan perubahan (tambah/hapus/ubah atribut/geser posisi),
  3. Modul terkait (agar kita cek potensi override lain).
Kita akan bantu merumuskan xpath yang kokoh dan siap produksi.

Leave a Comment

Share this Doc

Cara Menggunakan XPath di XML Odoo

Or copy link

CONTENTS