如何创建和自定义注册器

301 阅读6分钟

注册器是 Odoo JavaScript 框架中很强大的组件,它们本质上是一个有序的键/值对集合。它们是扩展 Web 客户端功能的关键工具,因为很多核心功能都是通过查找注册器中的定义来实现的,比如字段、视图或者服务。因此,通过在合适的注册器中添加新的值,您可以轻松自定义 Web 客户端的功能。本指南会带您了解如何使用、创建和自定义注册器。

什么是注册器?

在 Odoo 中,注册器是一种保存键值对的结构化方式。它们是 Odoo 18 Web 客户端中扩展功能的重要工具,能够帮助您扩展、替换或增强默认功能。您可以用注册器来扩展字段、视图、客户端操作或者服务。

示例:简单的键/值注册器

下面是一个如何创建简单注册器并向它添加键值对的例子。

import { Registry } from "@web/core/registry";

const myRegistry = new Registry();

myRegistry.add("hello", "odoo");

console.log(myRegistry.get("hello")); // 输出: "odoo"

在这个例子中,我们从 @web/core/registry 中导入了 Registry 类,并创建了一个叫 myRegistry 的实例。然后我们添加了一个键值对("hello" : "odoo"),并通过 get 方法检索这个值。

类别和子注册器

Odoo 注册器的一个很有用的功能是 类别。类别可以看作是子注册器,用于将相关的键/值对进行分组。

例如,Odoo 的 Web 客户端使用了 fields(字段)、views(视图)和 services(服务)等类别来组织核心功能。下面是如何使用类别的例子:

import { registry } from "@web/core/registry";

const fieldRegistry = registry.category("fields");
const serviceRegistry = registry.category("services");
const viewRegistry = registry.category("views");

如果子注册器(类别)还不存在,它会自动创建。接下来,您可以根据需求向这些注册器添加自定义值。

注册器 API 概述

创建注册器

要创建一个新的注册器,只需要实例化 Registry 类:

const customRegistry = new Registry();

请注意,注册器还可以作为 事件总线 使用。也就是说,当注册器发生更改时,您可以使用 UPDATE 事件来监听这些更新。

向注册器添加条目

add 方法用于向注册器中添加新条目:

myRegistry.add("newKey", "newValue", { force: true, sequence: 5 });
  • key:条目的唯一标识符。
  • value:与键关联的值。
  • options:可选参数。force 参数允许覆盖已存在的条目,sequence 参数用来确定条目的顺序。

获取条目

get 方法用于返回指定键的值。如果键不存在,就会抛出错误,除非提供了默认值:

const value = myRegistry.get("newKey", "defaultValue");

移除条目

要从注册器中移除条目:

myRegistry.remove("newKey");

这会触发一个 UPDATE 事件。

子注册器和类别

category 方法用于获取与指定类别名称关联的子注册器。如果该子注册器不存在,它会自动创建。

const mySubRegistry = myRegistry.category("myCategory");

Odoo 中常见的注册器类别

字段注册器

这个注册器用于在 Web 客户端中注册字段定义。

import { registry } from "@web/core/registry";
const fieldRegistry = registry.category("fields");

您可以向注册器中添加自定义字段,从而扩展 Odoo 的默认字段。

视图注册器

视图注册器用于在 Web 客户端中注册和管理视图。

import { registry } from "@web/core/registry";
const viewRegistry = registry.category("views");

您可以通过向视图注册器中添加自定义视图来扩展 Odoo 的界面。例如,您可以创建自定义的表单视图、列表视图等。

视图小部件(view_widgets)注册器

视图小部件注册器用于在视图中添加特定的小部件,这些小部件可以为视图提供额外的功能。

import { registry } from "@web/core/registry";
const viewWidgetRegistry = registry.category("view_widgets");

viewWidgetRegistry.add("myCustomWidget", MyCustomWidgetComponent);

通过这种方式,您可以在视图中添加自定义的小部件,增强用户的交互体验。

服务注册器

服务注册器用于定义由 Odoo 框架激活的服务。

import { registry } from "@web/core/registry";

const myService = {
  dependencies: [...],
  start(env, deps) {
    // 自定义逻辑
  },
};

registry.category("services").add("myService", myService);

Systray 注册器

Systray 注册器可以让您定义显示在导航栏右侧 systray 区域的组件。

import { registry } from "@web/core/registry";

class MySystrayItem extends Component {
  // 组件逻辑
}

registry.category("systray").add("myAddon.myItem", {
  Component: MySystrayItem,
  sequence: 43,
});

sequence 数字决定了 systray 中项目的顺序,序号越小,项目越靠右显示。

动作处理器(action_handlers)注册器

动作处理器注册器用于管理客户端动作(actions)的处理逻辑。

import { registry } from "@web/core/registry";
const actionHandlerRegistry = registry.category("action_handlers");

actionHandlerRegistry.add("my_custom_action", (env, options) => {
  // 自定义动作逻辑
  console.log("执行自定义动作");
});

通过这种方式,您可以定义自定义的动作处理逻辑,使得 Odoo 客户端可以响应特定的动作。

报表处理器(ir.actions.report handlers)注册器

报表处理器注册器用于处理 Odoo 中的报表(report)动作。

import { registry } from "@web/core/registry";
const reportHandlerRegistry = registry.category("ir.actions.report handlers");

reportHandlerRegistry.add("custom_report_handler", (env, report) => {
  // 自定义报表处理逻辑
  console.log("生成自定义报表");
});

这样,您可以为报表动作添加自定义的处理器,从而定制报表的生成和展示方式。

动作注册器(actions)

动作注册器用于注册客户端可以调用的动作。

import { registry } from "@web/core/registry";
const actionRegistry = registry.category("actions");

actionRegistry.add("my_action_client", {
  name: "my_action_client",
  description: "This is a custom client action",
  execute(env, options) {
    // 自定义动作的执行逻辑
    console.log("执行自定义客户端动作");
  },
});

通过这种方式,您可以注册自定义的客户端动作,使得它们可以被 Odoo 客户端调用和执行。

在您的 Odoo 模块中自定义注册器

注册器非常强大,因为它们允许您扩展 Odoo Web 客户端的默认功能。您可以创建自己的类别,或者通过添加自定义的键/值对来扩展已有的类别,适应您的业务需求。

例如,如果您想在用户菜单中添加一个新菜单项,可以扩展 user_menuitems 注册器:

import { registry } from "@web/core/registry";

registry.category("user_menuitems").add("my_item", (env) => {
  return {
    description: env._t("Technical Settings"),
    callback: () => { env.services.action_manager.doAction(3); },
    hide: Math.random() < 0.5, // 示例:随机隐藏
  };
});

结论

Odoo 18 的注册器为您提供了一种结构化且灵活的方式,来自定义您的 Web 客户端行为。通过使用注册器,您可以轻松添加新的字段、视图、服务、组件和操作,使 Web 客户端能够完全满足您的需求。

通过上面的例子,您现在应该能够在自己的 Odoo 模块中有效地创建和扩展注册器。这份指南是一个起点,您可以在此基础上进一步探索,实现更复杂和高级的自定义功能。