如何在 Odoo 18 中向聊天窗口(Chatter)添加自定义按钮
在 Odoo 中,提升用户体验通常涉及对聊天窗口的定制——聊天窗口是针对特定记录进行交流和更新的集中平台。在聊天窗口中添加自定义按钮可以显著简化操作流程,使用户能够直接在界面中执行特定操作,例如触发工作流或生成报告。本文将指导您如何在 Odoo 18 中向聊天窗口添加按钮,涵盖必要的步骤和代码片段,帮助您定制此功能以更好地满足业务需求并提高整体效率。
在定制 Odoo 时,保持清晰和模块化的结构至关重要。这确保了所有组件(模型、视图、JavaScript 和模板)都正确放置并协同工作。在本节中,我们将概述模块的基本结构,该模块将允许我们向聊天窗口添加按钮。在深入研究代码之前,理解这种布局非常重要。
步骤 1:在 聊天窗口中创建按钮
要在聊天窗口中添加按钮,您需要创建一个扩展现有邮件聊天窗口模板的新模板。以下是具体操作:
在您的自定义模块中添加以下 XML 代码:
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-name="important.Chatter" t-inherit="mail.Chatter"
t-inherit-mode="extension">
<xpath expr="//*[contains(@class, 'o-mail-Chatter-activity')]"
position="before">
<button class="btn btn-warning text-nowrap me-2"
t-att-class="{'my-2': !props.compactHeight }"
data-hotkey="shift+i"
t-on-click="markAsImportant">
<span>标记为重要</span>
</button>
</xpath>
</t>
</templates>
此代码将在聊天窗口中添加一个“标记为重要”的自定义按钮。该 XML 模板通过继承 mail.Chatter 并添加一个自定义按钮来修改 Odoo 中的 Chatter 组件。xpath 表达式定位到聊天窗口的活动区域,并在其之前插入按钮。按钮使用警告颜色样式,并根据布局高度动态添加类。此外,定义了一个键盘快捷键(Shift+i),当点击按钮时,将触发 markAsImportant JavaScript 方法。
注意:属性“t-inherit-mode”:是odoo前端的一个视图继承属性,主要作用是控制模版继承时对被继承模版的影响程度,有两个不同的值primary和extension。不添加该属性时,默认为extension。
步骤 2:定义按钮的功能
接下来,您需要定义点击按钮时触发的功能。您将通过修补 Chatter 组件来添加新方法。
在您的模块中添加以下 JavaScript 代码:
/** @odoo-module **/
import { Chatter } from "@mail/chatter/web_portal/chatter";
import { patch } from "@web/core/utils/patch";
patch(Chatter.prototype, {
async markAsImportant() {
await this.env.services.action.doActionButton({
type: "object",
resModel: this.props.threadModel,
resId: this.props.threadId,
name: "action_mark_as_important",
});
},});
此代码定义了 markAsImportant 函数,该函数将在按钮被点击时触发。代码扩展了 Odoo 的聊天窗口组件,使其能够在点击自定义按钮时触发特定的服务器端操作。它使用 Odoo 核心工具中的 patch 函数,通过添加名为 markAsImportant 的新方法来增强现有的聊天窗口功能。当调用此方法时,它会通过 doActionButton 向服务器发送请求,目标为当前记录的模型和 ID。resModel 和 resId 参数动态引用模型(例如 sale.order)和模型中的特定记录,而操作名称(action_mark_as_important)指向将在服务器端执行的方法。
步骤 3:在模型中实现逻辑
现在,您需要定义点击按钮时更新记录的逻辑。在此示例中,我们将修改 sale.order 模型。
在您的 sale_order.py 文件中添加以下代码:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
important = fields.Boolean("重要", default=False)
def action_mark_as_important(self):
"""将记录标记为重要并在 Chatter 中发布消息"""
for record in self:
record.important = True
record.message_post(
body="此记录已被标记为重要。")
return {
'type': 'ir.actions.client',
'tag': 'reload',
}
在此代码中,我们创建了一个 important 字段,并定义了 action_mark_as_important 函数,该函数将记录标记为重要并在聊天窗口中发布消息。
步骤 4:将字段添加到视图中
为了确保新字段成为表单视图的一部分,您需要将其添加到适当的视图定义中。
添加以下 XML 代码以将字段包含在 sale.order 表单视图中:
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="sale_order_view_form" model="ir.ui.view">
<field name="name">
sale.order.view.form.inherit.chatter.button
</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="date_order" position="after">
<field name="important" invisible="1"/>
</field>
</field>
</record>
</odoo>
此 XML 代码将 important 字段添加到 sale.order 表单中,invisible=”1”将其设置为不可见。
步骤 5:更新 Manifest 文件
不要忘记更新自定义模块的 __manifest__.py 文件,以包含新的 XML 和 JavaScript 文件:
{
'name': 'Test model',
'version': '18.0.1.0.0',
'category': 'Tools',
'summary': 'Add a custom button to the chatter',
'depends': ['sale'],
'data': [
'views/sale_order_chatter.xml',
],
'assets': {
'web.assets_backend': [
'test_model/static/src/js/chatter_button.js',
'test_model/static/src/xml/mail_chatter_template.xml',
],
},
'installable': True,
'application': True,}
完成
完成上述步骤后,您将成功在 Odoo 18 的聊天窗口中添加一个按钮。点击“标记为重要”按钮后,important 字段将被更新,并在聊天窗口中发布一条消息。
通过遵循这些步骤,您可以成功地在 Odoo 18 中向聊天窗口添加自定义按钮,使用户能够直接从记录的通信中心触发特定操作。扩展聊天窗口功能的能力,从添加按钮到定义自定义逻辑,为增强平台内的用户交互打开了无数可能性。