迅睿CMS 模板标签:循环、条件、变量输出的写法

· 迅睿CMS · 阅读 15
摘要

迅睿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}。同一个模板里嵌套多层时,变量名不要写混,不然输出的东西张冠李戴。