Odoo 18 客户端动作(Client Action)配置指南
1. 定义客户端动作的XML菜单
在模块的 views 目录下创建 client_action_views.xml 文件,定义 ir.actions.client 记录及关联的菜单项:
<?xml version="1.0" encoding="UTF-8"?> <odoo> <data> <!-- 客户端动作定义 --> <record id="dashboard_ir_actions_client" model="ir.actions.client"> <field name="name">仪表盘</field> <field name="tag">test_model.dashboard</field> <!-- 唯一标识符,关联前端组件 --> <!-- 可选参数:target指定打开方式(current/main/fullscreen/new) --> <!-- <field name="target">main</field> --> </record> <!-- 菜单项定义 --> <menuitem name="仪表盘" id="advanced_dashboard_menu" sequence="1" action="dashboard_ir_actions_client" /> </data> </odoo>
关键参数说明
tag客户端动作的唯一标识符,用于前端组件注册时匹配(需与JavaScript代码中的注册标签一致)。target控制动作的显示方式:
- current:在主内容区域打开(默认)。
- fullscreen:全屏模式打开。
- new:在对话框/弹出窗口中打开。
- main:重置面包屑导航(清除历史路径)。
params(可选)传递给前端的参数(如Python字典格式的键值对)。
2. 实现前端组件(JavaScript)
在模块的 static/src/js 目录下创建 client_action.js,继承OWL的 Component 类并注册动作:
/** @odoo-module **/ import { registry } from '@web/core/registry'; import { Component } from '@odoo/owl'; // 定义仪表盘组件 export class AdvancedDashboard extends Component { setup() { // 初始化逻辑(如数据加载、服务调用) } } // 注册组件为客户端动作(tag需与XML中的tag一致) AdvancedDashboard.template = "test_model.advanced_dashboard"; // 关联模板名称 registry.category("actions").add("test_model.dashboard", AdvancedDashboard);
3. 定义模板(XML)
在 static/src/xml 目录下创建 client_action.xml,定义组件的UI结构:
<?xml version="1.0" encoding="UTF-8"?> <templates xml:space="preserve"> <t t-name="test_model.advanced_dashboard"> <div class="o_dashboard"> <h1>通过客户端动作渲染的仪表盘</h1> <!-- 动态内容可通过props或服务注入 --> </div> </t> </templates>
关键说明:t-name 需与JavaScript中 AdvancedDashboard.template 属性完全匹配。
4. 配置模块清单(manifest.py)
在 __manifest__.py 中确保XML和静态资源正确加载:
{ 'name': '高级仪表盘', 'version': '1.0', 'depends': ['web'], 'data': [ 'views/client_action_views.xml', # 加载XML菜单和动作 ], 'assets': { 'web.assets_backend': [ 'test_model/static/src/js/client_action.js', # 后端加载JS组件 'test_model/static/src/xml/client_action.xml', # 后端加载XML模板 ], }, }
操作验证
- 升级模块:在Odoo后台启用开发者模式,升级当前模块。
- 查看效果:在菜单中找到新增的“仪表盘”菜单项,点击后应显示模板定义的页面内容。
扩展说明
- 参数传递:通过 ir.actions.client 的 params 字段传递数据(如 {'key': 'value'}),在前端组件中通过 this.props 获取。
- 复杂交互:结合Odoo的服务(如 rpc、dialog)实现数据请求、弹窗等功能。
- 动作类型:除普通页面渲染外,客户端动作还可用于触发弹窗、导航跳转等前端逻辑。
通过以上步骤,可在Odoo 18中灵活配置客户端动作,实现自定义用户交互逻辑。