很多人把 Studio XML 编辑器想成“浏览器里开个文本框改 arch”。企业版实际上做得细得多。
主要参考:
enterprise/web_studio/controllers/xml_resource_editor.pyenterprise/web_studio/controllers/keyed_xml_differ.py
一、编辑器入口拿到的是 related views,不是一段孤立 XML
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
评论区