Odoo 13中通过自定义JS为弹窗添加供应商过滤器的问题(扩展relational_fields.js)
Odoo 13中通过自定义JS为弹窗添加供应商过滤器的问题(扩展relational_fields.js)
看起来你已经找对了要修改的核心方法_manageSearchMore,直接改原生文件能生效说明逻辑完全没问题!问题出在你只定义了扩展后的CustomFieldMany2One类,但没有告诉Odoo要使用这个自定义类来替换原生的FieldMany2One组件,所以你的代码根本没被实际调用到。
下面一步步帮你解决这个问题:
一、修改自定义JS文件,添加组件注册逻辑
Odoo的Web字段组件需要通过字段注册表field_registry来注册,让系统知道用你的自定义类替换原生的many2one字段。修改后的完整JS代码如下:
odoo.define('your_module_name.custom_relational_fields', function (require) { "use strict"; var relational_fields = require('web.relational_fields'); var FieldMany2One = relational_fields.FieldMany2One; var field_registry = require('web.field_registry'); // 引入字段注册表 var CustomFieldMany2One = FieldMany2One.extend({ _manageSearchMore: function (values, search_val, domain, context) { values = values.slice(0, this.limit); values.push({ label: _t("Search More..."), action: function () { var prom; if (context.res_partner_search_mode === 'supplier') { domain = domain.concat([['supplier_rank', '>', 0]]); } if (search_val !== '') { prom = this._rpc({ model: this.field.relation, method: 'name_search', kwargs: { name: search_val, args: domain, operator: "ilike", limit: this.SEARCH_MORE_LIMIT, context: context, }, }); } Promise.resolve(prom).then(function (results) { var dynamicFilters; if (results) { var ids = _.map(results, function (x) { return x[0]; }); dynamicFilters = [{ description: _.str.sprintf(_t('Quick search: %s'), search_val), domain: [['id', 'in', ids]], }]; if (context.res_partner_search_mode === 'supplier') { dynamicFilters = [{ description: _.str.sprintf(_t('Quick search: %s, Vendors'), search_val), domain: [['id', 'in', ids], ['supplier_rank', '>', 0]], }]; } } this._searchCreatePopup("search", false, {}, dynamicFilters); }.bind(this)); }.bind(this), classname: 'o_m2o_dropdown_option', }); return values; }, }); // 关键:将自定义类注册到字段注册表,替换原生的many2one字段 field_registry.add('many2one', CustomFieldMany2One); return { CustomFieldMany2One: CustomFieldMany2One, }; });
二、确保资产正确加载
你有两种方式加载自定义JS,选一种即可,不要同时使用:
方式1:通过manifest的assets配置
取消manifest里assets部分的注释,注意替换成你的模块名:
{ "name": "my module name| Purchase enhancement", "summary": "Apply changes to core Odoo purchasing module to adapt changes to the customer requirement.", "license": "LGPL-3", "author": "much. GmbH", "auto_install": false, "application": false, "sequence": 100, "category": "Purchase", "version": "13.0.6.26.0", "depends": ["base", "product", "purchase", "purchase_stock", "web"], "data": [ "views/purchase_order.xml", "views/product_views.xml", "views/res_partner_views.xml", "views/stock_picking_view.xml", "wizard/display_dialog_box.xml", "data/ir_config_parameter_data.xml" // 用manifest的assets时,移除data里的assets.xml ], "assets": { "web.assets_backend": [ "my_module/static/src/js/custom_relational_fields.js", ], } }
方式2:通过assets.xml
如果用这种方式,确保assets.xml在data列表里,路径正确:
<odoo> <template id="assets_backend" name="custom assets" inherit_id="web.assets_backend"> <xpath expr="." position="inside"> <script type="text/javascript" src="/my_module/static/src/js/custom_relational_fields.js"></script> </xpath> </template> </odoo>
三、清除缓存,测试效果
Odoo的资产缓存和浏览器缓存经常会导致修改不生效,务必做以下操作:
- 在Odoo后台,进入设置 -> 技术 -> 外观 -> 资产,点击"刷新资产"按钮
- 用快捷键
Ctrl+Shift+R强制刷新浏览器缓存 - 如果是开发模式,建议启动Odoo时加上
--dev=all参数,自动重载修改的文件
额外说明
你的逻辑是通过context.res_partner_search_mode === 'supplier'判断是否添加过滤器,这个上下文是采购模块的供应商字段自动传递的,只要注册了自定义类,在报价单的供应商字段点击"Search More..."就会自动带上供应商过滤器了。
备注:内容来源于stack exchange,提问作者MrWater
相关产品推荐
相关产品推荐

