Odoo16中如何修补StockForecasted组件?求技术支援
Odoo16 StockForecasted 组件 _getReportValues 方法补丁失效解决
问题背景
需要在Odoo16中修补StockForecasted组件的_getReportValues方法,但尝试的补丁代码未生效,浏览器打印StockForecasted显示undefined,推测组件未被模块显式导出,无法修改源码的情况下寻求解决办法。
原组件代码
class StockForecasted extends Component{ async _getReportValues(){ this.resModel = this.context.active_model || (this.context.params && this.context.params.active_model); // 其他原有逻辑 .... } }
尝试的补丁代码(未生效)
/** @odoo-module **/ import { patch } from '@web/core/utils/patch'; import { StockForecasted } from "@stock/stock_forecasted/stock_forecasted"; console.log(StockForecasted) patch(StockForecasted.prototype, 'test_my_stock.StockForecasted', { async _getReportValues(){ console.log('_getReportValuesInherit') this.resModel = this.context.active_model || (this.context.params && this.context.params.active_model); if (!this.resModel) { if (this.props.action.res_model) { const actionModel = await this.orm.read('ir.model', [Number(this.props.action.res_model)], ['model']); if (actionModel.length && actionModel[0].model) { this.resModel = actionModel[0].model } } else if (this.props.action._originalAction) { const originalContextAction = JSON.parse(this.props.action._originalAction).context; if (originalContextAction) { this.resModel = originalContextAction.active_model } } } } });
问题原因
StockForecasted组件未被@stock/stock_forecasted/stock_forecasted模块显式导出,直接通过import无法获取到该类,导致patch无法生效。
解决方案
通过Odoo的组件注册表获取StockForecasted组件的注册实例,使用patchComponent进行修补,同时注意调用原方法逻辑避免功能丢失:
/** @odoo-module **/ import { patchComponent } from '@web/core/utils/patch'; import { registry } from '@web/core/registry'; // 从actions注册表中获取StockForecasted组件 const StockForecastedAction = registry.category('actions').get('stock_forecasted'); if (StockForecastedAction) { patchComponent(StockForecastedAction, { async _getReportValues() { // 先执行原方法逻辑 await this._super(...arguments); console.log('_getReportValuesInherit'); // 自定义补充逻辑 if (!this.resModel) { if (this.props.action.res_model) { const actionModel = await this.orm.read('ir.model', [Number(this.props.action.res_model)], ['model']); if (actionModel.length && actionModel[0].model) { this.resModel = actionModel[0].model; } } else if (this.props.action._originalAction) { const originalContextAction = JSON.parse(this.props.action._originalAction).context; if (originalContextAction) { this.resModel = originalContextAction.active_model; } } } } }); }
关键说明
StockForecasted作为action组件注册在actions分类下,注册key为stock_forecasted,通过registry.category('actions').get('stock_forecasted')可获取到组件实例。- 使用
patchComponent替代patch来修补组件,无需直接访问类的原型。 - 必须调用
this._super(...arguments)执行原方法的逻辑,避免覆盖原有功能。
内容的提问来源于stack exchange,提问作者Duc Trong Pham
相关产品推荐
相关产品推荐

