第二十八章 模板语法速查
模板会整份编译,所以一处语法错整页 500;五种基本写法、四种取值形式、数据标签用法与四种会把页面弄坏的写法。
模板会被整份编译
模板不是「边读边解释」,而是在第一次访问时被翻译成一段 VBScript,存进 cache/theme/,之后直接执行。整份模板是一个编译单元,所以:
- 一处语法错,整页 500,而不是坏掉那一块。
- 模板编译通过但输出为空,页面会返回 200 和 0 字节,比 500 更难查。
- 模板里引用了不存在的变量,因为程序开了「要求变量声明」,整页直接报错。
下面所有示例都用 HTML 实体写花括号({ 显示成 {),所以在本页上不会被当成标签执行。你把它抄进模板时,要把实体还原成真正的花括号。
五种基本写法
| 写法 | 作用 |
|---|---|
{变量名} | 输出一个变量或表达式,做 HTML 转义 |
{$rs[字段]} | 输出当前循环行的某个字段 |
{if 条件} … {else} … {/if} | 条件判断,可多段 elseif |
{for …} … {/for} | 循环 |
{andvar:rs …} … {/andvar:rs} | 查一段数据,块内循环输出 |
取值的四种形式
| 写法 | 输出 | 什么时候用 |
|---|---|---|
{title} | 转义后的值 | 普通文字,最常用 |
{raw 表达式} | 原样输出,不转义 | 已经拼好的 HTML,例如下拉选项 |
{asp 表达式} | 转义后的计算结果 | 需要做简单运算或拼接 |
{andvar.geturl(…)} | 函数返回值 | 生成链接、格式化日期 |
配置项用方括号取:andvar[webmode] 会被翻成读站点设置。当前行的字段除了直接写列名,还有几个内置别名:
| 别名 | 含义 |
|---|---|
[link] | 这一行的前台地址,按栏目/内容/语言自动拼 |
[fileurl] | 图片或附件地址,手机端会自动换成窄图 |
[catepic] | 栏目封面,手机端自动换图 |
[c_tags] | Tags 渲染成链接 |
[c_keys] | 关键词渲染成链接 |
查 category 表时主键叫 cateid,查 content 表时叫 id。两者写混不会报错,只会得到空结果或空链接。
数据标签 andvar:rs
{andvar:rs field="id,classid,title" top="10" table="content" where="classid=13 and islock=1" order="ordnum,id"} <a href="{$rs[link]}">{$rs[title]}</a>{/andvar:rs}| 参数 | 缺省 | 说明 |
|---|---|---|
field | * | 要取的列,逗号分隔。漏写的列取出来是空,链接会变空 href |
top | 10 | 最多取几条;写 0 表示不限制 |
table | — | 表名,content、category、lang、插件表都可以 |
where | — | 过滤条件,可用当前页变量,如 [sonid] 表示「本栏目及其子栏目」 |
order | — | 排序,如 ordnum,id desc;不写就按入库顺序 |
var | — | 给循环变量改名,默认是 rs;嵌套两层时必须改名 |
group | — | 按某列分组,组内只取第一条 |
pagesize page | — | 分页取数 |
iscache | — | 块级缓存,键按模板、城市、语言、端区分 |
页面变量
模板能直接用的变量由入口页面决定,不是所有页面都有全部变量:
| 变量 | 列表页 | 详情页 | 含义 |
|---|---|---|---|
classid classname | 有 | 有 | 当前栏目编号与名称 |
catename | 有 | 有 | 栏目名(面包屑用) |
catedesc | 无 | 有 | 栏目描述。列表页取不到,要用 seodesc 或再查一次栏目表 |
sonid | 有 | 有 | 本栏目与全部子栏目的编号串 |
followid | 有 | 有 | 上级栏目编号 |
modeid | 有 | 有 | 页面模型:0 链接、1 表单、3 单页、4 列表 |
title content | 无 | 有 | 当前内容标题与正文 |
seotitle seokey seodesc | 有 | 有 | SEO 三项,已按栏目/内容算好 |
webroot skins | 有 | 有 | 站点根路径、当前皮肤路径 |
c_name langid ismobile | 有 | 有 | 城市名、语言编号、是否手机端 |
引用公共片段
{andvar:include("../../head1.html")}:把另一个模板文件原样并进来,路径相对当前模板。被引用的片段与调用页共享同一套变量。{andvar:block("名字")}:取站点根目录block/名字.html。本站这个目录为空,机制可用但没启用。{showpage}:输出分页条,只在有分页数据的页面上有效。
四种会把页面弄坏的写法
- 正文里的字面花括号。纯 HTML 里写
{价格}会被当成表达式编译。要显示花括号,写实体。空的{}是安全的,程序会原样保留。 - 在模板里写服务端脚本定界符。模板本身会被编译,再写一层定界符等于让编译器把后面的内容当脚本,整页 500。
- 内联脚本里的
{ var … }。模板把{var …}当成自己的变量指令,整段会被吃掉,页面上看不出报错,只是脚本没了。JS 尽量放进theme/主题/js/;必须内联时,左花括号后先换行。 - 条件块里嵌了另一个标签。
{if …}只认自己的结束标记,块里再塞一个不配对的标签,会把整段结构打乱。
改模板前先复制一份到站点外。模板改坏的典型症状是「页面 200 但一片空白」或「整页 500 且后台没有记录」——这两种都不是浏览器问题,直接看模板最后一次改动。
速查:想做什么,怎么写
| 目的 | 写法 |
|---|---|
| 输出当前栏目名 | {classname} |
| 输出文章标题 | {title} |
| 输出文章链接 | 在内容循环里写 {$rs[link]} |
| 只显示有图的条目 | 在 where 里加 and pic<>'' |
| 按排序号再按编号排 | order="ordnum,id" |
| 取同栏目最新 5 条 | top="5" … where="classid=[classid] and islock=1" order="id desc" |
| 取本栏目及子栏目 | where="classid in([sonid]) and islock=1" |
| 手机与电脑显示不同内容 | {if ismobile} … {else} … {/if} |
| 格式化日期 | {andvar.getdate(createdate,"-",1)} |
| 输出分页 | {showpage} |
接下来怎么读
- 列表页怎么写:第二十九章。详情页怎么写:第三十章。
- 页头、页脚这类公共片段:第三十一章。
- 改完不生效:第三十三章。
微信扫码聊需求