Odoo 视图继承不是“把 XML 复制一份”:XPath、position 和 primary/extension 讲透
看懂 ir.ui.view 如何把继承链拼成最终 arch,为什么 XPath 找不到、position 失效,往往不是 Odoo 随机坏了。
TOPIC PICKS
看懂 ir.ui.view 如何把继承链拼成最终 arch,为什么 XPath 找不到、position 失效,往往不是 Odoo 随机坏了。
可以顺着继续读的相邻方向
很多人把 Odoo 前端的 `patch()` 理解成一个“官方版 monkey patch”。但 `core/utils/patch.js` 里真正精巧的地方,不是把方法盖上去,而是怎样保留原属性、重建 `super` 链、兼容 getter/setter,并在 unpatch 时按剩余扩展重新回放。它解决的是可维护补丁,而不是一次性篡改。
很多人以为 Odoo Web Client 的页面切换只是“改一下 hash 或 query 参数”。但从 `core/browser/router.js` 与 `webclient/actions/action_service.js` 看,真正稳定的是一整套状态编排:路径段、查询参数、actionStack、history state 与 sessionStorage 在一起接力,才让刷新、前进后退与深链接保持一致。
在邮件模板、营销内容或可编辑 HTML 场景里,很多人把 Odoo 动态占位符理解成“往正文里塞一个字段路径”。但 html_editor 的 dynamic_placeholder_plugin.js 表明,它真正管理的是模型上下文、字段链选择、datetime 格式化、默认值兜底,以及最终落成 QWeb 节点的过程。
很多人把富文本编辑器的撤销理解成浏览器原生 Ctrl+Z。但 Odoo 的 html_editor 源码表明,它自己维护了一套可序列化、可预览、可恢复的历史系统。本文从 HistoryPlugin 出发,讲清 Odoo 编辑器为什么要自己接管 DOM 变更历史。
很多人做 Odoo 网站动态 snippet 定制时,只盯着模板和接口返回值。可 website 的 dynamic snippet 源码说明,真正稳定的机制是过滤器获取、模板缓存、dataset 默认值、类名切换和 loading/empty 状态协同。本文把这条链路拆开讲清楚。
很多人第一次看 Odoo 的 Notebook 组件,会把它理解成一个普通 tabs 容器:点击 tab,切换面板,结束。但从 `notebook.js` 和 `notebook.xml` 往下看,官方真正维护的是一套更克制的页面切换契约:当前激活页如何选、默认页失效时怎么回退、不可见页如何跳过、字段校验异常又如何回流到 tab 标题。本文把这条前端链路拆开讲透。