模板改错文件没反应:Z-Blog 模板层级的加载顺序理一遍

· zblog · 阅读 5
摘要

上周有人把 index.php 改了三遍,前台一点没变。我让他把改的那段发过来,看了一眼就说:你改的是列表页模板,但他要看的是文章页。 Z-Blog 的模板不是「改哪个文件就影响哪个页面」,它按请求类型挑模板。挑错了,写多少代码都是白写

Z-Blog 模板层级示意

上周有人把 index.php 改了三遍,前台一点没变。我让他把改的那段发过来,看了一眼就说:你改的是列表页模板,但他要看的是文章页。

Z-Blog 的模板不是「改哪个文件就影响哪个页面」,它按请求类型挑模板。挑错了,写多少代码都是白写。

先认清楚是哪个请求

一个页面进来,内核先判断这是首页、分类页、标签页、文章页还是搜索页,然后按顺序去找模板文件。规则写在 zb_system/function/c_system_template.php 里,找模板的那几个方法是 GetTemplate 和 PrepareTemplate 一类的名字,各版本细节有差别,你按自己装的版本核对。

实际动手时不用背表,看两处就够:一个是浏览器地址栏的路径,一个是模板目录里有哪些文件。

zb_users/theme/你的主题/template/
  index.php      # 首页
  catalog.php    # 分类/标签列表
  single.php     # 文章页与独立页面
  search.php     # 搜索结果
  comment.php    # 评论区
  header.php  footer.php  sidebar.php

这堆文件里,catalog.php 和 single.php 是最容易混的一对。分类列表走 catalog,点进某一篇才走 single。你说「文章列表样式不对」,改的应该是 catalog.php。

子模板优先,overwrite 不是万能的

Z-Blog 允许在 template 目录下建子目录做细粒度覆盖,比如给某个分类单独一套列表模板。这类约定的文件名各版本不完全一致,我上次用的写法在 1.7 上生效,换到另一个站就没触发,最后回退成改主模板 + 判断分类 ID 解决。

所以遇到「改了没反应」,先排除三件事:

一,缓存。后台清一次模板缓存再刷新,这是最常见的假象。

二,文件真被读了吗。在模板最上面加一行标记性的 HTML 注释,刷新页面看源码里有没有。没有,就是模板选错了。

三,有没有同名的子模板在抢。把 template 目录按修改时间排一遍,最近动过的文件一个个排除。

需要条件判断就往主题 include.php 里放

「只在文章页插一段统计代码」这种需求,别在模板里堆 if。主题的 include.php 里挂 ActivePlugin_主题ID,用 $zbp->current 或者模板里可用的全局变量判断当前类型,再输出。这样模板保持干净,改成别的页面逻辑也不用翻两处。

说实话我不太推荐在 single.php 顶部直接写一大段判断。跑得动,但三个月后自己都看不懂。

改模板这件事,八成的时间花在找对文件上,写代码本身反而快。先确认请求类型,再看缓存,最后才怀疑语法。顺序错了,折腾半天还是原地打转。