首页 / 开发文档 / 套标签与失败模式(实测)

套标签与失败模式(实测)

哪些嵌套能用、哪些写法会静默出错。下面每一条都是在真编译器上跑出来的。

结论先说

标签**可以随意嵌套** —— 常见的那几种都是好的,包括「带 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} 是不是一一对应 —— 十次里有九次是少写或多写了一个闭合,而不是别的问题。

写模板时的检查顺序

  1. 先看那个块渲染了没有:整块不见了 → 大概率是标签名拼错或块标签没闭合。
  2. 块在、但里面是空的 → 看取值前缀对不对({list.…} / {shop.…} / {detail.…})。
  3. 值不对 → 看条件判断:下拉/单选字段存的就是选项文本,比的是中文而不是英文键名。
  4. 顺序不对 → 看 order 是不是写了不在名单上的键。
没找到答案? 可以在 联系我们 留言说明使用场景,我们会补充进文档。