第八章 X2Many组件
基于odoo18.0
今天我们来讨论X2Many字段在odoo18.0中的实现。
X2Many组件支持两种展示形式,一种是在列表视图中的部件(list_x2many_fields)和另外一种在表单视图中的组件(x2many_fields)。
X2Many Fields
X2Many Link部件
某些情况下,我们会碰到这样的需求,在X2many的视图中点击打开新的浏览器页,将附加的资源直接打开。这种部件在Odoo原生中并不存在,因此我们手动实现了这个部件,并给他命名为X2Many Link(x2many_link)。
设计思路
很显然,我们的新部件是继承自X2Many Fields组件而来,我们需要做的是针对于使用了x2many_link部件的列表,重写其openRecord方法,使其在新的浏览器页面中打开目标资源。
import { X2ManyField } from "@web/views/fields/x2many/x2many_field";
import { registry } from "@web/core/registry";
export class X2ManyFieldLink extends X2ManyField {
async openRecord(record) {
// return super.openRecord(record);
let url = window.location.href;
let host = url.split("/odoo")[0];
// search form action
let actions = await record.model.orm.call("ir.actions.act_window", "search_read", [[["res_model", "=", record._config.resModel]]])
console.log(actions)
if(!actions || actions.length == 0){
return super.openRecord(record);
}
let action = actions[0];
url = host +"/odoo/" + action.path + "/" + record._config.resId;
window.open(url);
}
}
...
registry.category("fields").add("x2many_link", x2ManyFieldLink);
我们先定义了一个新的组件X2ManyFieldLink并重写了它的openRecord方法,在openRecord方法中,我们对当前页面的URL进行了解析,只保留了域名,然后根据目标模型进行了窗口动作查询,并将结果解析成为可以在浏览器中打开的路径。如果目标模型没有相应的窗口动作,那么我们将使用原生的打开效果。