第二章:Odoo Web框架?

在上一章中,我們學習了如何使用Owl框架及其不同的概念?,F在我們可以學習如何使用Odoo JavaScript框架,該框架是建立在Owl之上的。

../../../_images/previously_learned.svg

這是我們在 第一章:組件 結束時發現 JavaScript web 框架的進展。?

awesome_tshirt 模塊中,我們將構建我們的 Awesome 儀表板。這將是一個很好的機會,可以發現 Odoo JavaScript 框架中的許多有用功能。

目標

../../../_images/overview_02.png

本章節中每個練習的解決方案都托管在 官方Odoo教程存儲庫 中。

1. 新布局?

Odoo Web客戶端中的大多數屏幕都使用相同的布局:頂部有一個控制面板,帶有一些按鈕,下面是一個主要的內容區域。這是通過使用 Layout組件 <https://github.com/odoo/odoo/blob/16.0/addons/web/static/src/search/layout.js>`_在 `@web/search/layout 中實現的。

Exercise

更新位于 awesome_tshirt/static/src/AwesomeDashboard 組件,使用 Layout 組件。您可以使用 Layout 組件的 display 屬性,如下所示: { "top-right": false, "bottom-right": false } 。

../../../_images/new_layout.png

2. 添加一些快速導航按鈕?

Bafien Carpink想要在Odoo中為常用視圖提供易于訪問的按鈕。為了實現這一點,您需要使用操作服務。

Services 是Odoo JavaScript框架定義的一個概念,它是一個持久的代碼片段,可以導出狀態和/或函數。每個服務可以依賴其他服務,組件可以使用 useService() 鉤子導入服務。

Example

這展示了如何使用動作服務從組件中打開設置視圖。

import { useService } from "@web/core/utils/hooks";
...
setup() {
    this.action = useService("action");
}
openSettings() {
    this.action.doAction("base_setup.action_general_configuration");
}
...

Exercise

讓我們在控制面板左下角區域添加三個按鈕。

  1. 一個名為“客戶”的按鈕,點擊后打開一個看板視圖,顯示所有客戶(這個操作已經存在,所以你應該使用 其xml id)。

  2. 一個名為“新訂單”的按鈕,點擊后會打開一個列表視圖,顯示最近7天內創建的所有訂單。

  3. 一個名為“已取消訂單”的按鈕,點擊后會打開一個列表,其中包含了最近7天內創建但已經被取消的所有訂單。

../../../_images/navigation_buttons.png

3. 調用服務器,添加一些統計信息?

讓我們通過添加一些卡片(請參見Owl培訓中制作的 Card 組件)包含一些統計信息來改進儀表板。有一個路由 /awesome_tshirt/statistics 將執行一些計算并返回一個包含一些有用信息的對象。

每當我們需要調用特定的控制器時,我們需要使用 rpc 服務 。它只導出一個函數來執行請求: rpc(route, params, settings) 。

這里是有關各種參數的簡短說明:

  • route 是目標路由,以字符串形式表示。例如 /myroute/ 。

  • params 是一個包含所有將提供給控制器的數據的對象。(可選)

  • settings 是用于請求的高級控制??梢允蛊潇o默,或使用特定的 xhr 實例。(可選)

Example

一個基本的請求可能是這樣的:

setup() {
    this.rpc = useService("rpc");
    onWillStart(async () => {
        const result = await this.rpc("/my/controller", {a: 1, b: 2});
        // ...
    });
}

Exercise

  1. 修改 Dashboard 以使用 rpc 服務。

  2. onWillStart 鉤子中調用統計路由 /awesome_tshirt/statistics 。

  3. 在儀表板中顯示幾張包含以下內容的卡片:

    • 本月新訂單數量

    • 本月新訂單的總金額

    • 本月每個訂單的T恤平均數量

    • 本月取消訂單數量

    • 從“新建”到“已發送”或“已取消”的訂單平均處理時間

../../../_images/statistics.png

4. 緩存網絡調用,創建服務?

如果你打開瀏覽器的開發者工具,在網絡選項卡中,你可能會發現每次顯示客戶端操作時都會調用 /awesome_tshirt/statistics 。這是因為每次掛載 Dashboard 組件時都會調用 onWillStart 鉤子。但在這種情況下,我們可能更希望只在第一次調用時執行,因此我們實際上需要在 Dashboard 組件之外維護一些狀態。這是服務的一個很好的用例!

Example

下面的示例注冊了一個簡單的服務,每5秒顯示一次通知。

import { registry } from "@web/core/registry";
const myService = {
    dependencies: ["notification"],
    start(env, { notification }) {
        let counter = 1;
        setInterval(() => {
            notification.add(`Tick Tock ${counter++}`);
        }, 5000);
    },
};
registry.category("services").add("myService", myService);

Exercise

  1. 實現了一個新的 awesome_tshirt.statistics 服務。

  2. 它應該提供一個名為 loadStatistics 的函數,一旦調用,就執行實際的rpc,并始終返回相同的信息。

  3. 也許可以使用 memoize 實用函數,來自 @web/core/utils/functions

  4. Dashboard 組件中使用此服務。

  5. 檢查它是否按預期工作

5. 顯示餅圖?

每個人都喜歡圖表(?。?,因此讓我們在我們的儀表板中添加一個餅圖,顯示每個尺碼銷售的T恤比例:S/M/L/XL/XXL。

在這個練習中,我們將使用 Chart.js。這是圖表視圖使用的圖表庫。但是,默認情況下它不會被加載,因此我們需要將其添加到我們的資產包中,或者進行懶加載(通常更好,因為如果用戶不需要它,他們就不必每次加載chartjs代碼)。

Exercise

  1. 加載 chartjs,您可以使用 loadJs 函數來加載 /web/static/lib/Chart/Chart.js 。

  2. 在一個 Card (來自之前的練習),在儀表板中顯示一個 餅圖,顯示每個尺碼的已售 T 恤的正確數量 (該信息可在統計路由中獲得)。

    ../../../_images/pie_chart.png

6. 更進一步?

以下是一些小的改進建議,如果您有時間可以嘗試一下:

Exercise

  1. 確保你的應用程序可以進行 翻譯 (使用 env._t )

  2. 點擊餅圖的某個部分應該打開一個列表視圖,其中包含所有具有相應大小的訂單。

  3. 添加一個 SCSS 文件,嘗試更改儀表板操作的背景顏色。

../../../_images/misc.png