创建独立的 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 应用程序并正确配置它:它将创建一个环境,启动 services,确保应用程序已翻译并允许应用程序访问资产包中的模板等。

其他资料

Owl components reference

2. 创建包含我们的代码的资源包

在模块的清单中,创建一个新的 assets bundle。它应该包含 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 框架的组件使用引导类来设置样式和布局。

小心

确保您的独立应用程序的文件仅添加到此捆绑包中,如果您已经有 web.assets_backendweb.assets_frontend 的定义并且它们具有 glob,请确保这些 glob 与您的独立应用程序的文件不匹配,否则您的应用程序的启动代码将与这些捆绑包中的现有启动代码冲突。

其他资料

Module manifest reference

3. 调用资源包的XML视图

现在我们已经创建了资产包,我们需要创建一个使用该资产包的 QWeb view

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <template id="your_module.standalone_app">&lt;!DOCTYPE html&gt;
        <html>
            <head>
                <script type="text/javascript">
                    var odoo = {
                        csrf_token: "<t t-nocache="The csrf token must always be up to date." t-esc="request.csrf_token(None)"/>",
                        debug: "<t t-out="debug"/>",
                        __session_info__: <t t-esc="json.dumps(session_info)"/>,
                    };
                </script>
                <t t-call-assets="your_module.assets_standalone_app" />
            </head>
            <body/>
        </html>
    </template>
</odoo>

这个模板只做了两件事:它初始化 odoo 全局变量,然后调用我们刚刚定义的资产包。初始化 odoo 全局变量是必要的步骤。该变量应该是一个包含以下内容的对象:

  • CSRF 令牌,在许多情况下需要与 HTTP 控制器交互。

  • 调试值,在许多地方使用它来添加额外的日志记录或开发人员友好的检查。

  • __session_info__,包含来自服务器的始终需要且我们不想执行额外请求的信息。下一节将详细介绍这一点。

4. 渲染视图的控制器

现在我们有了视图,我们需要让用户可以访问它。为此,我们将创建一个 HTTP controller 来呈现该视图并将其返回给用户。

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!”。此时,您可以开始实际为您的应用程序编写代码。