第二十八章 模板语法速查

Ju7CMS 用户手册 · 发布于 2026-10-27 · 更新于 2026-10-27

模板会整份编译,所以一处语法错整页 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
top10最多取几条;写 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}:输出分页条,只在有分页数据的页面上有效。

四种会把页面弄坏的写法

  1. 正文里的字面花括号。纯 HTML 里写 {价格} 会被当成表达式编译。要显示花括号,写实体。空的 {} 是安全的,程序会原样保留。
  2. 在模板里写服务端脚本定界符。模板本身会被编译,再写一层定界符等于让编译器把后面的内容当脚本,整页 500。
  3. 内联脚本里的 { var … }。模板把 {var …} 当成自己的变量指令,整段会被吃掉,页面上看不出报错,只是脚本没了。JS 尽量放进 theme/主题/js/;必须内联时,左花括号后先换行。
  4. 条件块里嵌了另一个标签。{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}

接下来怎么读

  1. 列表页怎么写:第二十九章。详情页怎么写:第三十章。
  2. 页头、页脚这类公共片段:第三十一章。
  3. 改完不生效:第三十三章。