模板继承改了个文件名,我的静态资源在子主题里"集体失踪"了

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 89 浏览 0 回复

上周给站点做主题换肤,想着用模板继承搞一套基础骨架,再让子主题去覆写颜色和布局。结果改了个资源目录名,前端直接白屏,控制台红得跟过年似的。

事情是这样。我在基础主题里定了个规范:CSS 放 /static/base/css/,子主题覆写就丢 /static/child/css/。模板里用 {__STATIC__}/css/style.css 这种写法,本地测得挺好,子主题一上线,样式全丢。

查了半小时才发现,子主题继承时我图省事,把 base.html 里的资源路径直接复制到了子主题的 head block 里,想着"覆盖一下更保险"。结果子主题的 __STATIC__ 解析出来指向的是子主题自己的资源根目录,可我把公共库(比如 Tailwind 基础构建文件)留在了 base 主题目录下。子主题目录里根本没有那些文件,浏览器 404 了一排。

更坑的是,我为了"优雅",在子主题里用 {block name="css"}{/block} 这种方式预留样式槽位,但基础主题里我写了:

{block name="css"}
<link rel="stylesheet" href="{__STATIC__}/base/css/core.css">
{/block}

子主题一继承,要么全盘覆写丢失 core.css,要么复制粘贴导致路径解析混乱。最后改成基础主题只放 {block name="css"}{/block} 空槽,公共库挪到 {include file="public/head" /} 里固定引入,子主题只管填自己的增量样式,才算把路径边界理清楚。

还有个教训:静态资源发布路径千万别在模板里"隐式约定"。我后来把资源映射收进了一个 theme.php 配置,子主题注册时声明自己的 assets_path,模板里统一走 {:config('theme.assets_path')},虽然多了层配置,但至少换主题时不会到处改路径字符串。

现在我的基础主题目录结构长这样:

/base/
  /view/
    layout.html          ← 只放骨架,不绑具体资源路径
    /block/
      head.html          ← 公共库在这里用绝对路径引入
  /static/               ← 基础公共库
/child/
  /view/
    index.html           ← {extend name="base@layout"} 然后填 block
  /static/               ← 只放覆盖和增量

模板继承省的是重复代码,不是省脑子。路径这东西,多一层显式配置,少一层玄学调试。

评论0
回复 · 0
还没有回复
微信客服 微信客服