Odoo 10中继承并修改POS模块JavaScript函数的技术问询
继承并修改Odoo 10 POS模块的Orderline set_quantity函数
嘿,要修改Odoo 10 POS里models.js中Orderline模型的set_quantity函数,完全不用碰核心代码,用自定义模块做非侵入式继承就搞定了,下面给你一步步拆解操作:
1. 先搭好自定义模块的基础架子
你得先建一个自定义模块,结构大概是这样:
your_custom_pos_module/ ├── __init__.py ├── __manifest__.py ├── static/ │ └── src/ │ └── js/ │ └── pos_custom.js
__init__.py可以是空文件,主要是让Python识别这是个合法模块。
2. 写继承修改的JS代码
在pos_custom.js里,用Odoo POS自带的继承方式来改写set_quantity函数,有两种常见写法:
写法一:部分重写(保留原逻辑+加自定义代码)
如果你想在原函数的基础上加点自己的逻辑,比如先打个自定义日志,再执行原逻辑,之后再加额外操作:
odoo.define('your_custom_pos_module.pos_custom', function(require) { "use strict"; var models = require('point_of_sale.models'); // 继承Orderline模型 models.Orderline = models.Orderline.extend({ set_quantity: function(quantity){ // 先打印自己的自定义日志 console.log('自定义提示:修改数量触发啦,当前传入数量是', quantity); // 调用原函数的逻辑,要是不想保留原逻辑就删掉这行 this._super(quantity); // 加自己的自定义逻辑,比如数量超过10时触发提示 if (parseFloat(quantity) > 10) { console.log('数量超10了哦!'); // 这里还能加弹窗或者其他POS交互,比如调用POS的提示组件 } }, }); return models; });
写法二:先执行原逻辑再补代码
要是你想原函数逻辑跑完之后再做自己的操作,也可以这样写:
odoo.define('your_custom_pos_module.pos_custom', function(require) { "use strict"; var models = require('point_of_sale.models'); // 先存下原函数的引用,避免覆盖后找不到 var original_set_quantity = models.Orderline.prototype.set_quantity; models.Orderline = models.Orderline.extend({ set_quantity: function(quantity){ // 先执行原函数的所有逻辑,用call绑定正确的上下文 original_set_quantity.call(this, quantity); // 原逻辑跑完后,加自己的操作 console.log('当前订单行的最终数量是', this.quantity); // 这里写你的其他自定义代码 }, }); return models; });
3. 配置模块让JS加载生效
在__manifest__.py里,要告诉Odoo加载我们的自定义JS文件,配置大概是这样:
{ 'name': 'POS自定义修改', 'version': '1.0', 'depends': ['point_of_sale'], # 依赖POS核心模块,确保加载顺序正确 'data': [], 'qweb': [], 'assets': { 'point_of_sale.assets': [ 'your_custom_pos_module/static/src/js/pos_custom.js', ], }, 'installable': True, 'auto_install': False, }
4. 安装模块测试
把这个模块放到Odoo的addons目录下,更新模块列表,安装这个自定义模块,然后打开POS界面,修改订单行的数量,打开浏览器控制台(F12)就能看到我们的自定义日志,确认逻辑生效啦!
几个关键注意事项
- 绝对不要直接修改Odoo核心模块的代码,不然以后升级版本会非常麻烦,继承才是最佳实践。
- 调用原函数的时候,要确保
this的上下文正确,用_super或者call来绑定就行。 - Odoo 10的POS基于Backbone.js开发,所以继承规则跟Backbone的模型继承完全一致。
内容的提问来源于stack exchange,提问作者KbiR
相关产品推荐
相关产品推荐

