iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
Odoo

用 Odoo 打造數位轉型引擎:從基礎建置到跨領域應用系列 第 22

Day 22:Odoo 的前端框架 Owl 與 Web 客製化

  • 分享至 

  • xImage
  •  

到目前為止,我們已經介紹了 Odoo 的後端開發,包括 Model、View、Controller 與 API 整合。今天要換個角度,來看看 Odoo 的 前端技術。從 v14 開始,Odoo 引入了 Owl (Odoo Web Library),這是一個現代化的前端框架,讓 Odoo 的 Web 與使用者介面更加模組化與高效。


1. Owl 是什麼?

Owl 是由 Odoo 團隊開發的前端框架,類似 ReactVue.js,但針對 Odoo 的需求進行最佳化。其特色包括:

  • 組件化設計:UI 可以拆分為可重複使用的元件。
  • 響應式資料綁定:當 Model 資料變更時,自動更新 UI。
  • 輕量快速:效能優於傳統的 QWeb 前端模板。
  • 與 Odoo 深度整合:支援 Odoo Web Client 與後端 RPC 呼叫。

2. Owl 的基本範例

一個簡單的 Owl 元件:

/** hello_component.js **/
import { Component } from "@odoo/owl";

export class HelloComponent extends Component {
    static template = "hello_template";
    static props = ["name"];
}

對應的模板:

<!-- hello_template.xml -->
<t t-name="hello_template">
  <div>
    <h3>Hello <t t-esc="props.name"/>!</h3>
  </div>
</t>

掛載元件:

import { mount } from "@odoo/owl";
mount(HelloComponent, document.body, { props: { name: "Odoo" } });

顯示結果:

Hello Odoo!

3. Odoo Web 自訂功能

透過 Owl,開發者可以客製化 Odoo 的 Web 客戶端:

  • 新增自訂元件:例如專案進度條、即時通知面板。
  • 擴充現有畫面:例如在 CRM 商機頁面插入 AI 預測小工具。
  • 單頁應用 (SPA):打造互動性更強的管理介面。

4. 後端與前端的整合

Odoo 前端與後端之間透過 RPC (Remote Procedure Call) 溝通。

範例:前端呼叫後端 Model 方法

import { rpc } from "@web/core/network/rpc";

async function getBooks() {
    const result = await rpc("/web/dataset/call_kw", {
        model: "library.book",
        method: "search_read",
        args: [],
        kwargs: { fields: ["name", "author"] },
    });
    console.log(result);
}

這段程式會呼叫 library.book 模型,取得書籍清單,並在前端渲染。


5. Owl 的優勢與挑戰

  • 優勢

    • 開發體驗接近主流框架(React/Vue)。
    • 更容易維護與重複使用 UI 元件。
    • Odoo 官方全力支持,未來將逐漸取代傳統 QWeb 前端。
  • 挑戰

    • 文件與資源相對較少,學習曲線較高。
    • 舊版模組大多仍使用 QWeb,需要混合維護。

小結

Odoo 的前端正在快速演進,Owl 讓開發者能打造更現代化的使用者體驗:

  • 組件化 + 響應式 → 開發效率高。
  • 與後端 RPC 深度整合 → 流程順暢。
  • 適合打造自訂 Web 應用與互動式介面。

在下一篇文章中,我將介紹 Odoo 的測試框架 (Unit Test 與 Integration Test),幫助開發者提升程式品質與穩定性。


上一篇
Day 21:Odoo 與外部系統 API 整合
系列文
用 Odoo 打造數位轉型引擎:從基礎建置到跨領域應用22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言