Odoo 网站模块内容存储机制与mega-menu渲染逻辑的程序化修改问询
Odoo 网站模块全量内容存储路径梳理
- 菜单配置类:所有层级的菜单记录(含普通下拉、mega-menu)基础信息统一存储在
website.menu表,包含菜单名称、排序值、父级关联关系、绑定跳转链接、所属站点、激活状态等基础字段 - 横幅、全站媒体资源:全量存储在
ir.attachment表,通过website_id字段做多站点数据隔离,数据库仅存储文件索引、存储路径、元数据,图片二进制实体挂载在文件系统或对象存储路径下 - 通用文本、HTML片段类:分为两类存储路径,一类是固定页面布局的原生内容,存储在
ir.ui.view表的arch结构字段,按站点做专属视图隔离;另一类是前端可视化编辑器用户自定义保存的内容块,存储在website.page表的内容字段,所有编辑修订历史同步记录在html_editor.history表 - Mega-Menu专项存储结构:无独立的数据表,核心关联关系全部复用现有表结构:
- mega-menu的识别标记:
website.menu表的is_mega_menu布尔字段,值为真时判定为mega-menu类型 - 下拉展开的整块内容:通过
website.menu表的content_view_id外键,关联ir.ui.view表的专属视图记录,该视图的XML结构就是mega-menu展开后展示的列布局、链接、图片、文本片段 - 布局样式配置:
website.menu表的mega_menu_classes文本字段,存储前端编辑器设置的全宽展开、多列排布等CSS类名
- mega-menu的识别标记:
- 页面加载时,后端
website模型触发_build_menu方法,遍历当前站点所有已激活的菜单记录,生成前端渲染的上下文参数 - 渲染分支判断:遍历到菜单记录时,先校验
is_mega_menu字段值,值为假则走普通菜单渲染逻辑,直接输出带跳转链接的列表节点;值为真则取出content_view_id关联的视图内容,直接嵌入到下拉容器的DOM结构中,不做额外的内容过滤 - 前端交互层通过原生Bootstrap的下拉组件逻辑,实现鼠标悬浮/点击时展开mega-menu的完整内容块
菜单项渲染流程自定义、追加目标HTML的落地方法
- 视图扩展方案(无侵入):继承网站主菜单的公共模板,通过xpath选择器定位菜单项的渲染循环节点,在对应位置追加自定义HTML内容。示例代码结构:
<template id="custom_menu_badge" inherit_id="website.primary_menu"> <xpath expr="//li[hasclass('nav-item') and a[@t-attf-href=menu.url]]" position="inside"> <span t-if="menu.mega_menu and menu.id == 自定义标记的目标菜单ID" class="badge bg-warning ms-2">限时活动</span> </xpath> </template> - 模型重写方案(灵活性更高):在自定义模块中继承
website.menu模型,重写_build_menu方法,在生成渲染上下文前,给指定菜单记录追加自定义的HTML字段值,再在对应菜单渲染模板中读取该值输出到页面,适合需要动态判断展示条件的场景 - 注意事项:所有自定义逻辑需放在独立自定义模块中实现,禁止直接修改核心数据表的原生结构,避免Odoo版本升级时出现兼容问题
内容的提问来源于stack exchange,提问作者Zahid
相关产品推荐
相关产品推荐

