迅睿CMS 模板标签:循环、条件、变量输出的写法
迅睿CMS的模板标签语法跟国内常见的CMS差别挺大,写惯了帝国、织梦的人第一次看会有点陌生。 这篇把常用的几类整理出来。 变量输出 {$title} {$content} {$cat.name} 看着像 Smarty,实际上它是迅睿自己
迅睿CMS的模板标签语法跟国内常见的CMS差别挺大,写惯了帝国、织梦的人第一次看会有点陌生。 这篇把常用的几类整理出来。
变量输出
{$title}
{$content}
{$cat.name}
看着像 Smarty,实际上它是迅睿自己的模板引擎。变量不带 $ 的地方通常是数组取值,中间用点号。
循环:栏目列表
{category pid="0" num="10"}
<li><a href="{$t.url}">{$t.name}</a></li>
{/category}
{category} 是栏目调用标签,pid="0" 表示一级栏目,num 是数量。{$t} 是循环体里的当前项。
这个 {$t} 不是固定名,有些标签里是 {$v},有些是 {$vo}。文档里每个标签都会说明循环变量名,写错了就是空输出,不报错。
循环:文章列表
{module module="news" num="10"}
<div class="item">
<h2><a href="{$t.url}">{$t.title}</a></h2>
<p>{$t.description}</p>
</div>
{/module}
module 参数填的是内容模块的目录名,不是模块显示名。后台「内容 → 模块管理」里能看到每个模块的目录名。
写显示名是最常见的错误。比如模块叫「新闻中心」,目录名可能是 news。写 {module module="新闻中心"} 什么都出不来。
条件判断
{if $catid == 10}
这是新闻栏目的内容
{elseif $catid == 11}
这是案例栏目的内容
{else}
其它
{/if}
语法上比较接近 PHP 直接写法,用 ==、!=、>、< 这些比较符。
有个坑:模板编译后是 PHP,== 是弱比较。字符串 "10abc" 跟 10 比会相等。做类型敏感的判定要用 ===。
格式化输出
{$t.updatetime|date="Y-m-d"}
{$t.content|str_cut=100}
{$t.title|htmlspecialchars}
| 是过滤器语法,等号右边是参数。
str_cut 是迅睿自己的函数,按字符截取,中文也算一个——这点比 substr 好用,substr 截中文会乱码。
分页
分页标签必须放在列表标签内部:
{module module="news" num="20" page="1"}
...
{/module}
{$pages}
page="1" 告诉标签开启分页,列表循环外面输出 {$pages}。
我第一次写的时候把 {$pages} 放在了 {module} 里面,分页链接能出来,但点第二页还是第一页的内容。原因是分页数据是在标签闭合后才生成的。
缓存与动态
迅睿CMS的模板标签默认会缓存。如果标签数据不常变,这是好事,页面快。
但会员相关的内容必须动态:
{module module="order" num="10" cache="0"}
cache="0" 关掉这个标签的缓存。
我遇到过:会员中心的订单列表没加这个参数,用户下了新订单刷新页面看不到。查了一会儿才发现是标签缓存,缓存时间设的是 3600 秒。
标签嵌套
迅睿的标签可以嵌套,但要注意闭合顺序:
{category pid="0" num="5"}
<dl>
<dt>{$t.name}</dt>
{module module="news" catid="$t.id" num="5"}
<dd><a href="{$v.url}">{$v.title}</a></dd>
{/module}
</dl>
{/category}
内层标签用外层循环变量 $t.id 作为参数,这个在迅睿里是支持的。
但要注意——内层 {module} 的循环变量是 {$v},外层是 {$t}。同一个模板里嵌套多层时,变量名不要写混,不然输出的东西张冠李戴。