資產?

在Odoo中管理資產并不像其他應用程序那樣直截了當。其中一個原因是我們有各種情況,其中一些資產是必需的,但不是全部。例如,Web客戶端、銷售點應用程序、網站甚至移動應用程序的需求是不同的。此外,有些資產可能很大,但很少需要使用:在這種情況下,我們可能希望它們是 按需懶加載 。

資產類型?

有三種不同的資產類型:代碼( js 文件),樣式( cssscss 文件)和模板( xml 文件)。

代碼

Odoo支持 三種不同類型的javascript文件 。所有這些文件都會被處理(本地JS模塊會被轉換為Odoo模塊),然后被壓縮(如果不在 debug=assets 模式 中),最后被合并。結果會被保存為文件附件。這些文件附件通常通過在頁面的 <head> 部分中使用 <script> 標簽(作為靜態文件)來加載。

樣式

樣式可以使用 cssscss 進行處理。與javascript文件一樣,這些文件會被處理( scss 文件會被轉換為 css ),然后被壓縮(如果不在 debug=assets 模式 中),最后被合并。結果會被保存為文件附件。通常它們會通過在頁面的 <head> 部分使用 <link> 標簽(作為靜態文件)進行加載。

模板

模板(靜態的 xml 文件)的處理方式不同:它們只是在需要時從文件系統中讀取并連接。

每當瀏覽器加載Odoo時,它會調用 /web/webclient/qweb/ 控制器來獲取 模板 。

了解在大多數情況下,瀏覽器只在第一次加載頁面時執行請求是很有用的。這是因為每個資源都與校驗和相關聯,該校驗和被注入到頁面源代碼中。然后將校驗和添加到URL中,這意味著可以安全地將緩存頭設置為長時間。

捆綁包?

Odoo資產按 捆綁包 分組。每個捆綁包(特定類型的 xml 、 js 、 cssscss文件路徑列表 )在 模塊清單 中列出??梢允褂?`glob<https://en.wikipedia.org/wiki/Glob_(programming)>`_語法聲明文件,這意味著您可以使用一行聲明多個資產文件。

每個模塊的 __manifest__.py 中都定義了 bundle,其中有一個專門的 assets 鍵,包含一個字典。該字典將 bundle 名稱(鍵)映射到它們包含的文件列表(值)。它看起來像這樣:

'assets': {
    'web.assets_backend': [
        'web/static/src/xml/**/*',
    ],
    'web.assets_common': [
        'web/static/lib/bootstrap/**/*',
        'web/static/src/js/boot.js',
        'web/static/src/js/webclient.js',
    ],
    'web.qunit_suite_tests': [
        'web/static/src/js/webclient_tests.js',
    ],
},

以下是大多數Odoo開發人員需要了解的一些重要的捆綁包列表:

  • web.assets_common : 這個 bundle 包含了大部分 web 客戶端、網站和銷售點共用的資源。這個 bundle 應該包含 odoo 框架的低級構建塊。請注意,它包含了定義 odoo 模塊系統的 boot.js 文件。

  • web.assets_backend : 此捆綁包包含特定于Web客戶端的代碼(特別是Web客戶端/操作管理器/視圖)

  • web.assets_frontend : 這個 bundle 包含了所有與公共網站相關的內容: 電子商務、門戶、論壇、博客等。

  • web.assets_qweb : 所有在后端環境和銷售點中使用的靜態XML模板。

  • web.qunit_suite_tests : 所有 JavaScript QUnit 測試代碼(測試、幫助程序、模擬)

  • web.qunit_mobile_suite_tests : 移動端專用的 QUnit 測試代碼

操作?

通常,處理資產很簡單:您只需要將一些新文件添加到常用的捆綁包中,例如 assets_commonassets_backend 。但是,還有其他操作可用于涵蓋一些更特定的用例。

請注意,所有針對特定資產文件的指令(即 before 、 after 、 replaceremove )都需要事先聲明該文件,無論是在更高層次的清單中還是在具有較低序列的 ir.asset 記錄中。

append?

此操作添加一個或多個文件。由于這是最常見的操作,因此可以通過簡單地使用文件名來完成:

'web.assets_common': [
    'my_addon/static/src/js/**/*',
],

默認情況下,將簡單字符串添加到包中將在包的末尾添加與 glob 模式匹配的文件。顯然,該模式也可以直接是單個文件路徑。

prepend?

在捆綁包的開頭添加一個或多個文件。

當您需要在捆綁包中將某個文件放在其他文件之前時很有用(例如使用css文件)。使用以下語法調用“prepend”操作: ('prepend', <path>) 。

'web.assets_common': [
    ('prepend', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],

before?

在特定文件之前添加一個或多個文件。

在捆綁包的開頭添加文件可能不夠精確??梢允褂?before 指令將給定的文件添加到目標文件的 前面 。它通過將普通路徑替換為 3 元組 ('before', <target>, <path>) 來聲明。

'web.assets_common': [
    ('before', 'web/static/src/css/bootstrap_overridden.scss', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],

after?

在特定文件后添加一個或多個文件。

before 相同,但匹配的文件將會在目標文件之后添加。通過使用 3 元組 ('after', <target>, <path>) 來聲明。

'web.assets_common': [
    ('after', 'web/static/src/css/list_view.scss', 'my_addon/static/src/css/list_view.scss'),
],

include?

使用嵌套包。

include 指令是在其他包中使用包以最小化清單大小的一種方式。在 Odoo 中,我們使用子包(按慣例以下劃線為前綴)批量處理在多個其他包中使用的文件。您可以像這樣指定子包作為一對 ('include', <bundle>)

'web.assets_common': [
    ('include', 'web._primary_variables'),
],

remove?

刪除一個或多個文件。

在某些情況下,您可能想要從捆綁包中刪除一個或多個文件。 這可以通過使用 remove 指令并指定一對 ('remove', <target>) 來完成:

'web.assets_common': [
    ('remove', 'web/static/src/js/boot.js'),
],

replace?

用一個或多個文件替換資產文件。

假設一個資產不僅需要被刪除,而且您還想在完全相同的位置插入新版本的該資產。這可以使用“replace”指令完成,使用3元組 ('replace', <target>, <path>)

'web.assets_common': [
    ('replace', 'web/static/src/js/boot.js', 'my_addon/static/src/js/boot.js'),
],

加載順序?

資產加載的順序有時非常關鍵,必須是確定性的,主要是為了樣式表優先級和設置腳本。Odoo中的資產處理如下:

  1. 當調用資產包時(例如 t-call-assets="web.assets_common" ),將生成一個空資產列表。

  2. 所有與該捆綁包匹配的 ir.asset 類型的記錄都會被獲取并按序列號排序。然后,所有序列號嚴格小于16的記錄都會被處理并應用于當前資產列表。

  3. 所有在其清單中聲明資產的模塊都將其資產操作應用于此列表。這是按照模塊依賴關系的順序完成的(例如,“web”資產在“網站”之前處理)。如果指令嘗試添加已經存在于列表中的文件,則不會對該文件執行任何操作。換句話說,列表中只保留文件的第一次出現。

  4. 剩余的 ir.asset 記錄(序列大于或等于16的記錄)也將被處理并應用。

在清單中聲明的資源可能需要按特定順序加載,例如在加載lib文件夾時,必須先加載 jquery.js ,然后再加載所有其他jquery腳本。一種解決方案是創建一個具有較低序列或“prepend”指令的 ir.asset 記錄,但還有另一種更簡單的方法。

由于資產列表中每個文件路徑的唯一性是有保證的,因此您可以在包含它的通配符之前提到任何特定文件。因此,該文件將出現在所有包含在通配符中的其他文件之前。

'web.assets_common': [
    'my_addon/static/lib/jquery/jquery.js',
    'my_addon/static/lib/jquery/**/*',
],

注解

一個模塊 b 移除/替換模塊 a 中聲明的資源將必須依賴于它。嘗試操作尚未聲明的資源將導致錯誤。

延遲加載?

有時動態加載文件和/或資源包是很有用的,例如只在需要時加載庫。為此,Odoo框架提供了一些輔助函數,位于 @web/core/assets 中。

await loadAssets({
    jsLibs: ["/web/static/lib/stacktracejs/stacktrace.js"],
});
loadAssets(assets)?
參數
  • assets (Object()) – 描述應該加載的各種資源

返回

Promise<void>

加載由 assets 參數描述的資源。它是一個對象,可能包含以下鍵:

類型

描述

jsLibs

string[]

JavaScript文件的URL列表

cssLibs

string[]

CSS文件的URL列表

useAssets(assets)?
參數
  • assets (Object()) – 描述應該加載的各種資源

當組件需要在其 onWillStart 方法中加載某些資源時,此鉤子非常有用。它內部調用了 loadAssets 。

資產模型 ( ir.asset )?

在大多數情況下,清單中聲明的資產將基本足夠。但是為了更靈活,框架還支持在數據庫中聲明的動態資產。

這可以通過創建 ir.asset 記錄來完成。這些記錄將被處理,就像它們在模塊清單中被發現一樣,并且它們具有與其清單對應項相同的表現力。

class odoo.addons.base.models.ir_asset.IrAsset(env, ids, prefetch_ids)[源代碼]?

這個模型對兩個方面做出了貢獻:

1. It provides a function returning a list of all file paths declared in a given list of addons (see _get_addon_paths);

2. It allows to create ‘ir.asset’ records to add additional directives to certain bundles.

name

資產記錄的名稱(用于識別目的)。

bundle

應用該資產的捆綁包。

directive (默認值為 append )

此字段確定如何解釋 path (如果需要,還包括 target )。以下是可用指令的列表以及它們所需的參數:

  • append : path

  • prependpath

  • beforetarget , path

  • after : target , path

  • include : path (被解釋為 bundle名稱

  • remove : path (被解釋為要刪除的 目標資產

  • replace : target , path

path

一個定義以下內容之一的字符串:

  • 一個相對路徑,指向插件文件系統中的資產文件;

  • 在插件文件系統中,將 **glob模式 ** 匹配到一組資產文件;

  • 一個指向附件或外部資產文件的 URL ;

  • 使用 include 指令時,表示 bundle 名稱 。

target

目標文件,用于在捆綁包中指定位置。只能與 replace 、 beforeafter 指令一起使用。

active (默認值為 True )

記錄是否激活

sequence (default= 16 )

資產記錄的加載順序(升序)。序列小于16表示該資產將在清單中聲明的資產之前進行處理。