创建独立的 Owl 应用程序¶
出于各种原因,您可能希望拥有一个不属于 Web 客户端的独立 Owl 应用程序。Odoo 中的一个例子是自助点餐应用,它让客户可以通过手机点餐。本章将介绍实现此类应用所需的条件。
概述¶
要拥有独立的 Owl 应用,需要以下几项:
应用的根组件
包含设置代码的资源包
调用该资源包的 QWeb 视图
渲染该视图的控制器
1. 根组件¶
为简单起见,我们先从一个仅渲染“Hello, World!”的简单组件开始。这样我们就能一眼看出设置是否正常工作。
首先,在 /your_module/static/src/standalone_app/root.xml 中创建模板。
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="your_module.Root">
Hello, World!
</t>
</templates>
然后,在 /your_module/static/src/standalone_app/root.js 中为该组件创建 JavaScript 文件。
import { Component } from "@odoo/owl";
export class Root extends Component {
static template = "your_module.Root";
static props = {};
}
通常,最好将挂载组件的应用设置代码放在单独的文件中。请在 /your_module/static/src/standalone_app/app.js 中创建用于挂载应用的 JavaScript 文件。
import { whenReady } from "@odoo/owl";
import { mountComponent } from "@web/env";
import { Root } from "./root";
whenReady(() => mountComponent(Root, document.body));
mountComponent 工具函数会负责创建 Owl 应用程序并正确配置它:它会创建环境、启动 服务、确保应用已翻译,并让应用可以访问资源包中的模板,等等。
更多内容
2. 创建包含我们代码的资源包¶
在模块的清单文件中创建一个新的 资源包。它应包含 web._assets_core 资源包,该资源包包含 Odoo JavaScript 框架及其所需的核心库(例如 Owl 和 luxon),之后您可以添加一个 glob,将应用的所有文件添加到该资源包中。
{
# ...
'assets': {
'your_module.assets_standalone_app': [
('include', 'web._assets_helpers'),
'web/static/src/scss/pre_variables.scss',
'web/static/lib/bootstrap/scss/_variables.scss',
('include', 'web._assets_bootstrap'),
('include', 'web._assets_core'),
'your_module/static/src/standalone_app/**/*',
],
}
}
其他行是使 Bootstrap 正常工作所必需的资源包和 scss 文件。它们是必需的,因为 Web 框架的组件使用 bootstrap 类来实现样式和布局。
小心
请确保独立应用的文件只添加到此资源包中。如果您已经为 web.assets_backend 或 web.assets_frontend 定义了资源包,并且其中使用了 glob,请确保这些 glob 不会匹配独立应用的文件,否则应用的启动代码将与这些资源包中已有的启动代码冲突。
更多内容
3. 调用资源包的 XML 视图¶
现在我们已经创建了资源包,接下来需要创建一个使用该资源包的 QWeb 视图。
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="your_module.standalone_app"><!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
var odoo = {
csrf_token: "<t t-out="request.csrf_token(None)"/>",
debug: "<t t-out="debug"/>",
__session_info__: <t t-out="json.dumps(session_info)"/>,
};
</script>
<t t-call-assets="your_module.assets_standalone_app" />
</head>
<body/>
</html>
</template>
</odoo>
此模板只做两件事:初始化 odoo 全局变量,然后调用我们刚才定义的资源包。初始化 odoo 全局变量是必需的一步。该变量应是一个包含以下内容的对象:
CSRF 令牌,在许多情况下与 HTTP 控制器交互时都需要它。
debug 值,许多地方用它来添加额外的日志记录或便于开发者排查的检查。
__session_info__,其中包含服务器始终需要的信息,对于这些信息我们不希望再发起额外的请求。下一节将详细介绍。
4. 渲染视图的控制器¶
现在我们已经有了视图,需要让用户能够访问它。为此,我们将创建一个 HTTP 控制器,用于渲染该视图并将其返回给用户。
from odoo.http import request, route, Controller
class YourController(Controller):
@route("/your_module/standalone_app", auth="public")
def standalone_app(self):
return request.render(
'your_module.standalone_app',
{
'session_info': request.env['ir.http'].get_frontend_session_info(),
}
)
请注意,我们向模板传递了 session_info。它来自 get_frontend_session_info 方法,最终会包含 Web 框架所使用的信息,例如当前用户的 ID(如果已登录)、服务器版本、Odoo 版本类型等。
此时,如果您在浏览器中打开 URL /your_module/standalone_app,应该会看到一个显示“Hello, World!”文本的空白页面。此时,您就可以开始真正编写应用的代码了。