企业 Studio 前端

Odoo 企业版 Studio XML 编辑器为什么不是“打开 arch 直接改”:related views、t-call 与 keyed diff patch 讲透

Studio XML 编辑器拿到的并不是单个 arch 文本,而是一组 related views 与 t-call 资源;真正落库时也不是整段覆盖,而是 keyed diff 生成补丁。

企业 前端
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 4 阅读

很多人把 Studio XML 编辑器想成“浏览器里开个文本框改 arch”。企业版实际上做得细得多。

主要参考:

  • enterprise/web_studio/controllers/xml_resource_editor.py
  • enterprise/web_studio/controllers/keyed_xml_differ.py

get_xml_editor_resources() 会调用 ir.ui.view.get_related_views(key),把相关视图一并读出来;同时扫描 //*[@t-call],把被调用模板的 xml id 也整理出来。

这很关键:Studio 面对的不是一棵孤树,而是一片有继承、有调用的视图森林。

二、为什么要显式识别 t-call

QWeb 模板里,真正渲染出来的页面经常横跨多个模板;如果编辑器只展示当前 view 的 arch,用户根本不知道自己改的是主模板、被调用模板还是继承链里的某个节点。

因此 Studio 会先收集 called_xml_ids,必要时把 docs 作用域下的主模板当作 main_view_key。这就是它能“看起来像在改一张页面”,实际上却还能保持模板语义不丢的原因。

三、保存时为什么用 keyed diff,而不是全量覆盖

keyed_xml_differ.py 的整套设计都在解决同一个问题:结构移动、属性改动、文本改动、节点插入/删除,应该尽量以最小补丁表达,而不是把整个 arch 重写一遍。

这样做的好处有三个:

  • 继承链更稳定
  • 合并冲突更少
  • Studio 改动更像“局部 patch”,而不是“把原视图洗掉重来”

四、结论

Studio XML 编辑器本质上是一个“视图资源收集器 + 模板调用分析器 + 差分补丁生成器”。理解这层前端机制,才知道为什么它看着像可视化编辑器,实际却一直在谨慎维护 QWeb 的结构边界。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。