创建一个独立的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应用程序并正确配置它:它会创建环境、启动 服务 、确保应用程序已翻译,并授予应用程序访问资源包中模板的权限等。

参见

Owl组件参考

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

在模块的清单文件中,创建一个新的 资源包 。它应包含 web._assets_core 资源包,其中包含Odoo JavaScript框架及其所需的核心库(例如Owl和luxon),然后可以通过通配符将应用程序的所有文件添加到资源包中。

{
    # ...
    '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_backendweb.assets_frontend 并且它们包含通配符,请确保这些通配符不会匹配独立应用程序的文件,否则应用程序的启动代码将与这些资源包中现有的启动代码发生冲突。

参见

模块清单参考

3. 调用资源包的XML视图

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

<?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控制器 ,它渲染该视图并将其返回给用户。

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