首页 / 开发文档 / 嵌套与失败模式

嵌套与失败模式

标签能怎么套、哪些写法不报错但内容会缺、什么样会整页 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} 是不是一一对应 —— 十次里有九次是少写或多写了一个闭合,而不是别的问题。

写模板时的检查顺序

  1. 先看那个块渲染了没有:整块不见了 → 大概率是标签名拼错或块标签没闭合。
  2. 块在、但里面是空的 → 看取值前缀对不对({list.…} / {shop.…} / {detail.…})。
  3. 值不对 → 看条件判断:下拉/单选字段存的就是选项文本,比的是中文而不是英文键名。
  4. 顺序不对 → 看 order 是不是写了不在名单上的键。
  5. 登录/开关判断不对 → 看是不是写成了 notempty(要用 eq="1")。
改了模板不生效?模板是按修改时间自动重编译的,正常改完刷新就是新的。 如果确实没变,先清一次后台的「模板缓存」—— 缓存是按主题存的,换主题或改主题目录也可能让它对不上。
没找到答案? 可以在 联系我们 留言说明使用场景,我们会补充进文档。