嵌套与失败模式
标签能怎么套、哪些写法不报错但内容会缺、什么样会整页 500 —— 写模板卡住时先看这一篇。
适用范围:写任何模板时都可能用上。建议先扫一眼。
结论先说
标签可以随意嵌套 —— 常见的那几种都是好的,包括「带 else 的
{naicha:if} 里再嵌 {naicha:if}」。
真正要小心的是写错的时候不报错:有几种写法页面照常渲染,只是内容少了一块。
能用的嵌套(逐条实测过)
| 写法 | 结果 |
|---|---|
{naicha:if}…{naicha:else}…{/naicha:if} 里再嵌一个 {naicha:if} | 正常 |
上面那种里再嵌一个带 else 的 {naicha:if} | 正常 |
{naicha:if} 里嵌两层 {naicha:if} | 正常 |
{naicha:if} 里嵌块标签(如 {naicha:list}) | 正常 |
块标签里嵌同名块标签({naicha:list} 里再嵌 {naicha:list}) | 正常(内层用同一个 {list.…} 前缀,取到的是内层那一行) |
属性值里嵌单标签:cid="{naicha:param name='cid'}" | 正常(最常用的写法) |
HTML 属性中间嵌条件:class="c{naicha:if var="x" eq="1"} on{naicha:else} off{/naicha:if}" | 正常,会拼出 class="c on" / class="c off" |
失败模式:这几种不报错,但内容会缺
| 写法 | 会发生什么 |
|---|---|
块标签忘写闭合:{naicha:list num="5"}{list.title} |
只有当整个文件里没有该标签的闭合标签时,编译器才会自动补 —— 而它把闭合补在开标签的紧后面,于是循环体那段文字落到了循环外面:那一块内容整段消失,页面其余部分看着正常。每个块标签都要手写闭合 |
标签名拼错:{naicha:lst}…{/naicha:lst} |
整对标签静默消失(既不报错,也不会原样输出),页面上那一块直接不见了 |
| 变量名拼错、字段不存在、循环外取循环内的字段 | 输出空串。方便,但也意味着拼错不会有人告诉你 —— 页面上就是空白 |
排序键写错:order="publish_time desc" |
静默回落到 sort desc。页面正常,只是顺序不对 |
站点设置里没有的键:{naicha:site name="slogan2"} |
输出空串 |
旧版本里写 {naicha:elseif …} |
整个 elseif 被吞掉:那一档内容永远不显示,而且后面的 {naicha:else} 会提前生效 |
| HTML 注释里写的标签 | 原样输出(浏览器不显示,等于没有)。注释里的花括号不当标签 —— 这是刻意的 |
会 500 的写法(编译产物是非法 PHP)
| 写法 | 报错 |
|---|---|
{naicha:else} 前面没有 {naicha:if} |
syntax error, unexpected 'else' —— 整页 500 |
{/naicha:if} 多写了一个 |
syntax error, unexpected 'endif' —— 整页 500 |
页面 500 且报 unexpected else / endif 时,先数字号。
数一数改过的那一段里
{naicha:if} 和 {/naicha:if} 是不是一一对应 ——
十次里有九次是少写或多写了一个闭合,而不是别的问题。
写模板时的检查顺序
- 先看那个块渲染了没有:整块不见了 → 大概率是标签名拼错或块标签没闭合。
- 块在、但里面是空的 → 看取值前缀对不对(
{list.…}/{shop.…}/{detail.…})。 - 值不对 → 看条件判断:下拉/单选字段存的就是选项文本,比的是中文而不是英文键名。
- 顺序不对 → 看
order是不是写了不在名单上的键。 - 登录/开关判断不对 → 看是不是写成了
notempty(要用eq="1")。
改了模板不生效?模板是按修改时间自动重编译的,正常改完刷新就是新的。
如果确实没变,先清一次后台的「模板缓存」—— 缓存是按主题存的,换主题或改主题目录也可能让它对不上。
