套标签与失败模式(实测)
哪些嵌套能用、哪些写法会静默出错。下面每一条都是在真编译器上跑出来的。
结论先说
标签**可以随意嵌套** —— 常见的那几种都是好的,包括「带 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:elseif}
三个以上的分支别再叠 {naicha:if}(很容易出现"两个分支同时成立、渲染出两段"),
用 {naicha:elseif}:
{naicha:if var="list.media_type" eq="video"}
<span class="badge play">▶ {list.duration}</span>
{naicha:elseif var="list.media_type" eq="audio"}
<span class="badge audio">♪ {list.duration}</span>
{naicha:elseif var="list.media_type" eq="image"}
<span class="badge pic">图集</span>
{naicha:else}
<span class="badge">图文</span>
{/naicha:if}
条件属性与 {naicha:if} 完全一样(var 配 eq/neq/gt/lt/in/empty/notempty),
靠 {naicha:else} 收尾,最后仍是一个 {/naicha:if} —— elseif 不闭合。
如果你用的是更早的版本,
{naicha:elseif} 会被静默吞掉 ——
引擎对认不出的标签一律输出空串,于是:
- 那一个分支的内容永远不显示;
- 它后面的
{naicha:else}会落进上一个 if 的 else 分支里, 于是"本该属于最后一个分支的内容"提前显示; - 页面 200、没有报错,看着像"排版少了一块"。
{naicha:if} 即可(功能一样,只是啰嗦)。
HTML 注释里的标签不生效
<!-- {naicha:site name="title"} -->
上面这句会原样输出(浏览器不显示),不会被当成标签执行。 这是刻意做的:在注释里写一句"这里用了某个标签"是最自然的写法, 而如果注释文本也参与编译,块标签就会去找闭合 —— 要么跨过注释把中间一大段正文吞掉, 要么配对失败整页 500,报错信息还指不到注释那一行。
想在模板里留可读的标签示例,直接写标签名不加花括号(注释里本来就只是给人看的)。
失败模式:这几种不报错,但内容会缺
| 写法 | 会发生什么 |
|---|---|
块标签忘写闭合:{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是不是写了不在名单上的键。
