企业 报表前端

Odoo 企业版 Studio 报表编辑器为什么不是“所见即所得 HTML”:QWeb 清洗、inline t-call 与变量提示链路讲透

web_studio/report.py 处理的不是普通 HTML 编辑,而是带 QWeb 语法、oe-origin 标记和 t-call 内联内容的混合文档;保存前后都要来回转换。

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

报表编辑器如果真按普通 HTML 富文本去做,第一轮保存就会把 QWeb 语义弄坏。企业版显然知道这一点。

主要参考:

  • enterprise/web_studio/controllers/report.py

一、Studio 面对的是“HTML 外壳 + QWeb 内核”的混合文档

html_to_xml_tree()_cleanup_from_client()_to_qweb()_html_to_client_compliant() 这一组函数来回转换,说明编辑器看到的 HTML 只是可编辑外壳,真正保存时还得还原成 QWeb。

例如 q-table/q-td 这类转换,就是为了让表格里夹着 <t> 节点时,浏览器编辑体验和 QWeb 语义都不至于崩掉。

二、为什么 t-call 内容要先拆组再重组

报表编辑器会把 t-call 内联展开,用户看起来像在一张文档里直接编辑;但保存时系统必须知道哪些节点属于主模板,哪些是被调用模板注入的内容。

所以源码先 _collect_t_call_content()、再 _recompose_arch_with_t_call_parts(),把散落在编辑器里的内容重新拼回原始调用结构。否则一旦直接保存,模板边界就会丢失。

三、变量提示为什么没法只靠静态字符串匹配

_guess_qweb_variables() 会尝试在受控环境里编译/安全求值表达式,并把 dotted expression 转成较可读的字段链路提示。也就是说,Studio 并不是简单给你列出几个变量名,而是在尽量推断“这段表达式在当前 report/qcontext 下可能指向什么”。

四、结论

Studio 报表编辑器不是通用 WYSIWYG。它真正做的是:让用户在“近似 HTML”的前端体验里编辑,同时在后台保护 QWeb 结构、t-call 边界和变量语义。

DISCUSSION

评论区

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