一、assets
在 Odoo 中管理资产(assets)并不像在其他一些应用程序中那样简单。原因之一是我们有多种场景需要不同的assets。例如,网络客户端、销售点应用程序、网站甚至移动应用程序的需求是不同的。此外,一些assets可能很大,但很少需要:在这种情况下,我们可能希望它们被延迟加载(按需)。
1、assets类型
共有三种不同的类型:代码(js文件)、样式(css或scss 文件)和模板(xml文件)。
js代码
Odoo 支持三种不同的 javascript 文件。一是系统处理所有这些文件(原生 JS 模块转换为 odoo 模块),二是压缩(可通过debug=assets mode解压缩)并连接。三是将结果保存为文件附件。这些文件附件通常通过页面部分中的
'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',
],
},
以下是一些常用且什么重要的捆绑:
web.assets_common: 此捆绑包包含 Web 客户端、网站和销售点常用的大多数assets。还包含 odoo 框架的较低级别的构建模块。它还包含 boot.js定义 odoo 模块系统的文件。
web.assets_backend: 此捆绑包包含特定于 Web 客户端的代码(特别是 Web 客户端/操作管理器/视图)
web.assets_frontend: 这个捆绑包是关于公共网站的所有特定内容:电子商务、门户、论坛、博客 …
web.assets_qweb: 后端环境和销售点中使用的所有静态 XML 模板
web.qunit_suite_tests: 所有 javascript qunit 测试代码(测试、助手、模拟)
web.qunit_mobile_suite_tests: 移动特定的 qunit 测试代码
操作
通常情况下,管理资产比较简单:只需增加一些新的文件到一个经常使用的绑定如 assets_common 或 assets_backend.,但也有一些交互操作。
在进行相关操作时,如. before, after, replace 和 remove,需要提前声明这些文件, 无论是在manifests时处于较高的层次或者在ir.asset记录处于较低的层级。
append
此操作添加一个或多个文件。既然是最常用的操作,简单的使用文件名就可以了:
'web.assets_common': [
'my_addon/static/src/js/**/*',
],
默认情况下,将简单字符串添加到包中会将匹配 glob 模式的文件附加到包的末尾。
prepend
在包的开头添加一个或多个文件。
当需要将某个文件放在包中的其他文件之前(例如使用 css 文件)时很有用。使用以下语法调用该prepend操作:.(‘prepend’, )
‘web.assets_common’: [
(‘prepend’, ‘my_addon/static/src/css/bootstrap_overridden.scss’),
],
before
在特定文件之前添加一个或多个文件。
在包的开头添加文件可能不够精确。该 before指令可用于在目标文件之前添加给定文件。它是通过用 3 元素元组替换正常路径来声明的 。(‘before’, , )
‘web.assets_common’: [
(‘before’, ‘web/static/src/css/bootstrap_overridden.scss’, ‘my_addon/static/src/css/bootstrap_overridden.scss’),
],
after
在特定文件之后添加一个或多个文件。
与 相同before,匹配文件紧跟在目标文件之后。它是通过用 3 元素元组替换正常路径来声明的 。(‘after’, , )
‘web.assets_common’: [
(‘after’, ‘web/static/src/css/list_view.scss’, ‘my_addon/static/src/css/list_view.scss’),
],
include
使用嵌套,将文件揉进捆绑包。
如下所示:(‘include’, )
‘web.assets_common’: [
(‘include’, ‘web._primary_variables’),
],
remove
删除一个或多个文件。
在某些情况下,您可能希望从包中删除一个或多个文件。这可以remove通过指定一对使用指令 来完成:(‘remove’, )
‘web.assets_common’: [
(‘remove’, ‘web/static/src/js/boot.js’),
],
replace
用一个或多个文件替换asset文件。
当一个asset不仅需要被删除,而且您还想在相同的位置插入该asset的新版本。这可以通过replace使用 3 元素元组的指令来完成:(‘replace’, , )
‘web.assets_common’: [
(‘replace’, ‘web/static/src/js/boot.js’, ‘my_addon/static/src/js/boot.js’),
],
加载顺序
加载资源的顺序有时很关键,主要用于样式表优先级和设置脚本。Odoo 中的asset处理如下:
当调用资产包时(例如t-call-assets=“web.assets_common”),会生成一个空的asset列表
与捆绑包匹配的所有类型的记录ir.asset都被提取并按序列号排序。然后,所有序列严格小于 16 的记录都将被处理并应用于当前asset列表。
所有在其清单中为所述捆绑声明asset的模块都将其asset操作应用于此列表。这是按照模块依赖的顺序完成的(例如,web asset在之前处理website)。如果指令尝试添加列表中已经存在的文件,则不会对该文件执行任何操作。换句话说,只有第一次出现的文件被保存在列表中。
剩余的ir.asset记录(序列大于或等于 16 的记录)也会被处理和应用。
清单中声明的资产可能需要以特定顺序加载,例如jquery.js在加载 lib 文件夹时必须在所有其他 jquery 脚本之前加载。一种解决方案是创建具有较低序列或“前置”指令的ir.asset 记录,但还有另一种更简单的方法。
由于保证了资产列表中每个文件路径的唯一性,因此您可以在包含它的 glob 之前加载任何特定文件。因此,该文件将在 glob 中包含的所有其他文件之前出现在列表中。
‘web.assets_common’: [
‘my_addon/static/lib/jquery/jquery.js’,
‘my_addon/static/lib/jquery/**/*’,
],
延迟加载
动态加载文件和/或资产包有时很有用,例如仅在需要时才加载库。为此,Odoo 框架提供了一些帮助函数,位于@web/core/assets.
await loadAssets({
jsLibs: [“/web/static/lib/stacktracejs/stacktrace.js”],
});
资产模型 ( ir.asset)
在大多数情况下,清单中声明的asset基本上就足够了。然而,为了获得更大的灵活性,该框架还支持在数据库中声明动态asset。
通过创建ir.asset记录来完成。这些将像在模块清单中找到一样被处理。
类: odoo.addons.base.models.ir_asset.IrAsset
name
资产记录的名称(用于识别目的)。
bundle
将在其中应用资产的捆绑包。
directive(默认= append)
此字段确定path(target如果需要)将如何解释。以下是可用指令及其所需参数的列表:
append:path
prepend:path
before: target,path
after: target,path
incloud:(path解释为捆绑名称)
remove :(path解释为要移除的目标资产)
replace:target,path
target
目标文件以指定捆绑包中的位置。只能与指令和replace.一起使用。before,after
active(默认= True)
记录是否处于活动状态
sequence(默认= 16)
资产记录的加载顺序(升序)。低于 16 的序列意味着asset将在清单中(manifest)声明的之前处理。
中亿丰数字集团 姜振建