如何通过代码永久替换Odoo15任务栏默认标题与favicon图标
Odoo 15 代码级永久替换默认Odoo标题与favicon实现方案
常规后台上传favicon的方案出现加载闪烁,本质原因是原生favicon引用硬编码在核心布局模板的最前端,用户上传的图标是DOM加载完成后才通过JS动态替换的,必然会先加载原生图标。要实现零闪烁永久替换,必须从模板层面覆盖原生资源引用,把自定义资源的加载优先级提到最高。
具体实现步骤
所有操作都在自定义模块中完成,不要直接修改Odoo原生源码,避免后续版本升级覆盖配置。
1. 零闪烁替换favicon
- 提前准备好自定义favicon文件,命名为
favicon.ico(兼容多端建议同时准备1616、3232尺寸),放到自定义模块的static/src/img/目录下。 - 在自定义模块的
views/templates.xml中继承核心web布局模板,设置最高优先级直接替换原生favicon引用,代码如下:
<odoo> <template id="custom_web_favicon" inherit_id="web.layout" priority="999"> <xpath expr="//link[@rel='icon']" position="replace"> <link rel="icon" type="image/x-icon" href="/your_custom_module/static/src/img/favicon.ico"/> <link rel="shortcut icon" type="image/x-icon" href="/your_custom_module/static/src/img/favicon.ico"/> </xpath> </template> </odoo>
关键参数说明:
priority="999"代表模板渲染优先级,数值越大越先渲染,确保这个替换逻辑在Odoo原生逻辑、所有第三方模块逻辑之前执行,浏览器解析head标签时第一时间加载自定义favicon,完全不会触发原生Odoo图标加载,从根源解决闪烁问题。
2. 全场景替换默认「Odoo」标题
Odoo的标题分为后端模板初始渲染的默认标题、前端JS动态拼接的菜单标题两部分,需要同时覆盖才能彻底去掉所有场景下的Odoo标识:
- 第一步在刚才的
custom_web_favicon模板中追加代码,替换初始title标签:
<xpath expr="//title" position="replace"> <title t-esc="title or '你的自定义系统名称'"/> </xpath>
- 第二步覆盖前端WebClient的标题生成逻辑,新建JS文件存放到自定义模块的
static/src/js/custom_title.js:
/** @odoo-module **/ import { WebClient } from "@web/webclient/webclient"; import { patch } from "@web/core/utils/patch"; patch(WebClient.prototype, { setup() { super.setup(); // 替换原生标题默认前缀,彻底移除Odoo字样 this.title.setParts({ zopenerp: "你的自定义系统名称" }); } });
- 第三步把JS文件注册到后台资源加载列表,在
templates.xml中追加模板:
<template id="custom_title_assets" inherit_id="web.assets_backend" priority="999"> <xpath expr="." position="inside"> <script type="text/javascript" src="/your_custom_module/static/src/js/custom_title.js"/> </xpath> </template>
3. 登录页适配(可选)
如果需要登录页也完全替换为自定义内容,只需要额外继承web.login_layout模板,用同样的高优先级替换登录页的favicon和title标签即可。
生效验证
升级自定义模块后,强制清空浏览器缓存(Ctrl+Shift+R)刷新页面,从页面加载第一帧到进入后台操作全流程,都不会出现原生Odoo的favicon和标题,只要自定义模块不卸载,后续Odoo小版本升级也不会重置配置。
内容的提问来源于stack exchange,提问作者Abraham Kalungi
相关产品推荐
相关产品推荐

