模板标签速查

一页看完所有语法、全部过滤器、按页面分类的可用变量,外加 15 段可直接复制的常用组件。

约 14 分钟 模板 代码块右上角可一键复制
本页目录(14 分钟读完)

这一章是查的,不是读的。忘了语法就翻这里。

一个标签一行,照着写就行。

标签怎么写#

标签怎么用作用
{$var}{$article.title}输出文字,自动防注入
{$a.b.c}{$article.data.color}取数组里的值
{$list[0].title}{$list[0].title}取列表第 1 条
{$var|filter}{$article.title|limit=20}加工一下再输出
{if}{if $item.is_hot == 1}热{/if}满足条件才显示
{elseif}{elseif $x > 1}…再看一个条件
{else}{else}…都不满足就显示这个
{/if}{/if}条件结束
{loop}{loop $list as $item}…{/loop}循环列表
{loop} 带序号{loop $list as $i => $item}…{/loop}循环,带序号
{foreach}{foreach $list as $item}…{/foreach}和 {loop} 一样
{include}{include common/header}引入页头、页脚
{layout}{layout layout}用哪个骨架,写在第一行
{content}{content}骨架里放正文的位置
{hook}{hook site_footer}插件挂载点
{lang}{lang common.home}取语言包
{raw}{raw}…{/raw}里面原样输出,不解析
{* *}{* 这是注释 *}模板注释,不显示
文本
{loop} 自带空值保护:列表是空的,整段不输出。
所以不用再包一层 {if}。

{/loop} 自己就带结束,不要再补 {/if}。

输出时怎么加工(过滤器)#

过滤器怎么用作用
date{$item.created_at|date=Y-m-d}时间格式
date{$item.created_at|date=Y年m月d日}中文日期
limit{$item.title|limit=20}最多 20 个字
limit{$item.title|limit=20,'…'}超了就加省略号
default{$item.author|default='佚名'}空了就显示备用
thumb{$item.thumb|thumb=400,260}缩略图地址(宽,高)
number{$item.price|number=2}保留 2 位小数
nl2br{$item.spec|nl2br|raw}换行变空行,要配 raw
upper{$code|upper}转大写
lower{$code|lower}转小写
json{$data|json}转 JSON
raw{$item.content|raw}原样输出 HTML

可以连着写,从左到右:

HTML
{$article.description|limit=120}
{$article.created_at|date=Y年m月d日}
文本
过滤器参数只能写死的数字或文字。
不能写 {$var},也不能写 100*2。

变量怎么取(全站都有)#

变量是什么怎么用
$site.name站点名称{$site.name}
$site.logoLogo{$site.logo}
$site.icp备案号{$site.icp}
$site.copyright版权{$site.copyright}
$site.statistics统计代码{$site.statistics|raw}
$seo.title本页标题{$seo.title}
$seo.keywords本页关键词{$seo.keywords}
$seo.description本页描述{$seo.description}
$user当前用户未登录是空的
$user.username用户名{$user.username}
$primary_nav页头导航(导航组){loop $primary_nav as $nav}…{/loop}
$nodes栏目树(页脚/侧边栏){loop $nodes as $nav}…{/loop}
$asset_css样式地址<link href="{$asset_css}">
$asset_js脚本地址<script src="{$asset_js}">
$csrf安全令牌表单里用
$keyword搜索词搜索框回填

变量怎么取(各页面)#

页面变量是什么
首页$latest最新内容
首页$lead头条
首页$feed头条以外的内容
首页$hot最热 5 条
栏目页$node当前栏目
栏目页$list本页内容
栏目页$pager分页
详情页$article当前文章
详情页$prev上一篇
详情页$next下一篇
详情页$related相关阅读
搜索页$list搜索结果
搜索页$keyword搜索词

$article 里常用的:

变量是什么
{$article.title}标题
{$article.content|raw}正文,必须 raw
{$article.thumb}封面图
{$article.description}摘要
{$article.url}详情页地址
{$article.views}浏览量
{$article.created_at|date=Y-m-d}发布时间
{$article.tags_links}标签链接

$node 里常用的:

变量是什么
{$node.name}栏目名
{$node.slug}栏目别名
{$node.description}栏目描述
{$node.thumb}栏目缩略图
{$node.banner}栏目横幅图
{$node.children}子栏目

$pager 里常用的:

变量是什么
{$pager.page}当前第几页
{$pager.last_page}最后一页
{$pager.prev}上一页页码
{$pager.next}下一页页码
{$pager.pages}页码列表(要循环它)
{$pager.total}一共多少条

常用片段直接抄#

两级导航#

HTML
<nav class="nav">
  <ul>
    <li><a href="/">首页</a></li>
    {loop $primary_nav as $nav}
    <li>
      <a href="{$nav.url}"{if $nav.target == '_blank'} target="_blank" rel="noopener"{/if}>{$nav.name}</a>
      {if !empty($nav.children)}
      <ul class="subnav">
        {loop $nav.children as $sub}
        <li><a href="{$sub.url}"{if $sub.target == '_blank'} target="_blank" rel="noopener"{/if}>{$sub.name}</a></li>
        {/loop}
      </ul>
      {/if}
    </li>
    {/loop}
  </ul>
</nav>

页头导航来自后台「导航管理」的导航组。怎么建、怎么绑 → 看 导航组

内容列表#

HTML
{loop $list as $item}
<article>
  <a href="{$item.url}">
    {if !empty($item.thumb)}
    <img src="{$item.thumb|thumb=280,200}" alt="{$item.title}">
    {/if}
    <h3>{$item.title}</h3>
  </a>
  <p>{$item.description|limit=90}</p>
  <time>{$item.created_at|date=Y-m-d}</time>
</article>
{/loop}

{if empty($list)}
<div>这个栏目还没有内容。</div>
{/if}

分页#

HTML
{include common/pager}

上一篇 / 下一篇#

HTML
{if !empty($prev)}
<a href="{$prev.url}">上一篇:{$prev.title|limit=30}</a>
{/if}
{if !empty($next)}
<a href="{$next.url}">下一篇:{$next.title|limit=30}</a>
{/if}

相关阅读#

HTML
{if !empty($related)}
<section>
  <h2>相关阅读</h2>
  <ul>
    {loop $related as $item}
    <li><a href="{$item.url}">{$item.title|limit=36}</a></li>
    {/loop}
  </ul>
</section>
{/if}

搜索框#

HTML
<form action="/search" method="get">
  <input type="search" name="q" value="{$keyword}" placeholder="搜索…">
  <button type="submit">搜索</button>
</form>

登录状态#

HTML
{if !empty($user)}
  <a href="/member">{$user.username}</a>
  <a href="/logout">退出</a>
{else}
  <a href="/login">登录</a>
  <a href="/register">注册</a>
{/if}

页脚(版权 + 备案)#

HTML
<footer>
  <p>{$site.copyright|default=''}</p>
  {if !empty($site.icp)}
  <a href="https://beian.miit.gov.cn/" target="_blank">{$site.icp}</a>
  {/if}
  {if !empty($site.statistics)}{$site.statistics|raw}{/if}
</footer>

当前栏目高亮#

HTML
{loop $primary_nav as $nav}
<a class="{if !empty($nav.active)}is-active{/if}" href="{$nav.url}">{$nav.name}</a>
{/loop}

写的时候注意这几条#

注意为什么
{$a+$b} 不能写输出标签里不能做算术
{$var|limit=$n} 不能写过滤器参数要写死
富文本要 |raw不加会显示一堆 &lt;p&gt;
用户输入不要 |raw会被注入
{/loop} 外面别再包 {if}会报错,整页 500
{endif} 不存在写了会在页面上显示出来
注释用 {* *}<!-- --> 里的标签照样执行

报错了对一下#

页面上看到原因怎么修
显示 {$article.title} 原文变量名写错,或这页没有这个变量对一下上面的变量表
显示 <?php模板语法错了看报错提示的行号
正文显示 <p>文字</p>忘了 |raw加上 |raw
显示 {endif}写了不存在的标签删掉它
500{if} 没关数一下 {/if} 够不够
列表一条都没有列表就是空的写 {if empty($list)} 提示句

下一步#

没找到答案? 在后台「缓存与维护 → 系统体检」里看环境是否正常;仍无解就打开 server_debug.php 复现一次,页面会直接告诉你异常文件与行号。