
本文详解如何将自定义用户字段(如 hide_product_information)安全、高效地从 Odoo 后端传递至 POS 前端,并在 ProductScreen 等组件中实时访问,适用于 Odoo 18 的新式 POS 数据加载机制。
本文详解如何将自定义用户字段(如 `hide_product_information`)安全、高效地从 odoo 后端传递至 pos 前端,并在 productscreen 等组件中实时访问,适用于 odoo 18 的新式 pos 数据加载机制。
在 Odoo 18 中,POS 前端的数据加载已全面转向声明式架构(基于 _load_pos_data_fields 和 pos.session/res.users 等模型的协同加载),不再推荐直接重写 _load_pos_data() 方法注入会话级动态字段——尤其当该字段实际归属用户维度时,强行挂载到 pos.session 不仅逻辑错位,还可能导致缓存不一致或权限校验失效。
✅ 正确做法:将字段绑定到 res.users 模型,并通过标准 POS 数据加载管道透出。
首先,扩展用户模型并显式声明该字段需同步至 POS:
# models/res_users.py
from odoo import models, fields, api
class ResUsers(models.Model):
_inherit = 'res.users'
hide_product_information = fields.Boolean(
string="Hide Product Information in POS",
help="If enabled, product details (e.g., description, barcode) will be hidden on the POS product screen."
)
@api.model
def _load_pos_data_fields(self, config_id):
# 必须调用父类方法以保留默认字段(如 id, name, groups_id 等)
res = super()._load_pos_data_fields(config_id)
# 显式添加自定义字段,确保其被包含在 POS 加载的 user 数据中
res += ['hide_product_information']
return res
⚠️ 注意事项:
-
config_id参数代表当前加载的 POS 配置(pos.config),可用于实现配置级条件过滤(例如仅对启用某功能的门店加载该字段); - 字段必须为
store=True(默认满足),且具备读取权限(确保对应用户组有res.users的 read 权限); - 修改后务必重启服务并更新模块(
-u your_module),否则前端无法识别新增字段。
前端使用时,无需 patch PosSession 或手动解析 session 数据。Odoo 18 的 this.pos 对象已自动预加载当前登录用户的完整信息(含扩展字段),可通过以下方式安全访问:
// static/src/js/screens/product_screen.js
import { patch } from '@web/core/utils/patch';
import { ProductScreen } from '@point_of_sale/app/screens/product_screen/product_screen';
patch(ProductScreen.prototype, 'my_module.ProductScreen', {
async onProductInfoClick(product) {
// ✅ 正确获取方式:从当前用户对象读取
const currentUser = this.pos.config.current_user_id;
if (currentUser && currentUser.hide_product_information) {
console.log('Product info is disabled for this user');
// 例如:阻止弹窗、隐藏详情区域等
return;
}
// 执行默认产品信息展示逻辑...
await super.onProductInfoClick(...arguments);
}
});
? 进阶提示:
- 若需响应式监听字段变更(如管理员后台实时修改用户设置),可结合
pos.env.services.user的 reactive 特性,或在useEffect(若使用 Hooks)中订阅pos的change事件; - 多语言字段建议搭配
ir.translation使用translate=True,并在 JS 中通过this.env._t()渲染; - 所有透出至前端的敏感字段应严格校验业务逻辑权限,避免通过字段暴露未授权数据。
综上,Odoo 18 的 POS 数据流强调“模型职责清晰”与“加载契约明确”。将用户偏好类字段交由 res.users._load_pos_data_fields() 统一管理,既符合框架设计范式,也保障了数据一致性、可维护性与安全性。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











