openSOURCE

openSOURCE

Did You Know?

All the tech in one platform

Odoo Dev FAQs

XML — views & data deklaratif

Estimated reading: 5 minutes 44 views

Selamat datang di bagian kedua FAQ OdooCamp: XML — views & data deklaratif. Prolog ini menjadi pengantar agar kita memiliki peta yang sama sebelum masuk ke pertanyaan‑pertanyaan teknis yang paling sering diajukan developer.


Mengapa XML Penting di Odoo?

Di Odoo, XML adalah bahasa deklaratif untuk:

  • Menyusun UI: form, tree (list), kanban, search, calendar, graph, pivot, gantt.

  • Mendaftarkan objek sistem: actions, menus, server actions, sequence, mail templates, cron, record rules.

  • Mewarisi & memodifikasi tampilan via inherit_id dan xpath.

Dengan XML, kita memisahkan presentasi dari logika Python, sehingga perubahan tampilan bisa dilakukan tanpa menyentuh business logic.


Mindset Kerja

Model (Python) → View (XML) → Action/Menu (XML) → Akses (Security)

  • Python mendefinisikan model dan field.

  • XML menata tampilan field, menambahkan tombol/section, dan menghubungkan ke action/menu.

  • Security (ACL/record rules) memastikan siapa yang boleh melihat/mengubah data.


Ruang Lingkup yang Akan Kita Bahas di FAQ XML

  1. Anatomi view: ir.ui.view, arch, tipe view (form/tree/kanban/dll.).

  2. Inheritance: inherit_id, teknik xpath (inside/after/before/replace/attributes).

  3. Actions & Menus: ir.actions.act_window, ir.ui.menu, binding view ke action.

  4. Search view: filter, group‑by, context, domain.

  5. Kanban & QWeb ringan di dalam view (perbedaan dengan QWeb template penuh).

  6. Data deklaratif: sequence, server action, mail template, cron, record rules.

  7. Translasi (i18n) pada string view.

  8. Prioritas & urutan load: priority view, data di __manifest__.py, noupdate.

  9. Diagnostik & anti‑pola: error element cannot be located, selektor rapuh, konflik override.


Anatomi Dasar View Inherit

<record id="my_model_view_form_inherit" model="ir.ui.view">
  <field name="name">my.model.form.inherit</field>
  <field name="model">my.model</field>
  <field name="inherit_id" ref="module_asal.view_form_asal"/>
  <field name="arch" type="xml">
    <!-- Modifikasi UI dengan xpath -->
    <xpath expr="//group[@name='main']" position="inside">
      <field name="x_custom_field"/>
    </xpath>
  </field>
</record>

Poin penting:

  • inherit_id menunjuk view asal yang akan kita ubah.

  • Semua perubahan diletakkan di <field name="arch" type="xml">.

  • expr harus unik & stabil agar tidak mudah rusak saat upgrade.


Pola Inheritance yang Aman (Ringkas)

  • Gunakan atribut stabil: @name, @id, atau struktur hierarki yang jelas.

  • Hindari seleksi berbasis urutan murni (//group)[1] kecuali terpaksa.

  • Untuk notebook/tabs, targetkan page[@name='...'] terlebih dahulu.

  • Pastikan hanya satu target jika memang hanya ingin mengubah satu area.

Contoh singkat variasi position:

<!-- inside: tambah anak -->
<xpath expr="//div[contains(@class,'oe_button_box')]" position="inside">
  <button name="action_do" type="object" class="oe_stat_button" icon="fa-play" string="Do"/>
</xpath>

<!-- after: sisipkan setelah target -->
<xpath expr="//field[@name='email']" position="after">
  <field name="x_secondary_email"/>
</xpath>

<!-- attributes: ubah atribut target -->
<xpath expr="//field[@name='website']" position="attributes">
  <attribute name="invisible">1</attribute>
</xpath>

Actions & Menus (Gambaran Cepat)

<!-- Action -->
<record id="action_my_model" model="ir.actions.act_window">
  <field name="name">My Model</field>
  <field name="res_model">my.model</field>
  <field name="view_mode">tree,form</field>
</record>

<!-- Menu -->
<menuitem id="menu_my_model_root" name="My App"/>
<menuitem id="menu_my_model" name="My Model" parent="menu_my_model_root" action="action_my_model"/>

Keterkaitan:

  • Action menentukan model & view_mode, menu mengarahkan user ke action itu.


Best Practices

  • Pisahkan view per model ke berkas *_views.xml agar mudah dirawat.

  • Konsisten pada ID: modelname_form_view, modelname_tree_view, action_modelname, menu_modelname.

  • Gunakan i18n untuk string UI; hindari hard‑code multi‑bahasa di satu template.

  • Cek konflik: modul lain bisa meng‑inherit view yang sama; pastikan selektor tidak terlalu umum.

  • Validasi di Developer Mode: gunakan menu Manage Views untuk meninjau tree final.


Anti‑Pola yang Perlu Dihindari

  • xpath tanpa konteks parent yang jelas.

  • Mengubah class tanpa mempertahankan kelas penting yang dipakai Odoo.

  • Mencampur logic bisnis ke XML (logic seharusnya di Python, XML untuk UI/deklaratif).


Diagnostik Cepat

  • Error: Element cannot be located → periksa expr dan struktur view asal.

  • Perubahan tidak muncul → pastikan modul ter‑upgrade, urutan load benar, dan tidak ditimpa modul lain.

  • UI rusak → cek kelas CSS, struktur grid/group, dan kesesuaian tipe view.


Checklist Sebelum Masuk ke FAQ Detail

  • View asal yang di‑inherit sudah teridentifikasi dengan benar.

  • xpath menyasar target yang unik dan stabil.

  • Action/menu terhubung ke model dan view mode yang sesuai.

  • String siap untuk i18n.

  • Uji di Developer Mode untuk verifikasi struktur akhir.


Yang Akan Kita Jawab di FAQ XML

  • Cara mencari target xpath yang paling aman.

  • Kapan pakai after/before/inside/replace/attributes.

  • Pola menambah stat button, smart button, dan group/section.

  • Mengatur search view (filter/group‑by/domain/context).

  • Menghubungkan view ke action/menu dan mengatur view_mode.

  • Menambahkan objek deklaratif lain: sequence, cron, mail template, record rule.

Dengan prolog ini, kita siap melangkah ke FAQ XML — views & data deklaratif dan membahas kasus‑kasus nyata yang sering kita temui di proyek Odoo 18 CE.

Leave a Comment

Share this Doc

XML — views & data deklaratif

Or copy link

CONTENTS