模板标签速查
一页看完所有语法、全部过滤器、按页面分类的可用变量,外加 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 |
可以连着写,从左到右:
{$article.description|limit=120}
{$article.created_at|date=Y年m月d日}过滤器参数只能写死的数字或文字。
不能写 {$var},也不能写 100*2。变量怎么取(全站都有)#
| 变量 | 是什么 | 怎么用 |
|---|---|---|
$site.name | 站点名称 | {$site.name} |
$site.logo | Logo | {$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} | 一共多少条 |
常用片段直接抄#
两级导航#
<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>页头导航来自后台「导航管理」的导航组。怎么建、怎么绑 → 看 导航组
内容列表#
{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}分页#
{include common/pager}上一篇 / 下一篇#
{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}相关阅读#
{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}搜索框#
<form action="/search" method="get">
<input type="search" name="q" value="{$keyword}" placeholder="搜索…">
<button type="submit">搜索</button>
</form>登录状态#
{if !empty($user)}
<a href="/member">{$user.username}</a>
<a href="/logout">退出</a>
{else}
<a href="/login">登录</a>
<a href="/register">注册</a>
{/if}页脚(版权 + 备案)#
<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>当前栏目高亮#
{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 | 不加会显示一堆 <p> |
用户输入不要 |raw | 会被注入 |
{/loop} 外面别再包 {if} | 会报错,整页 500 |
{endif} 不存在 | 写了会在页面上显示出来 |
注释用 {* *} | <!-- --> 里的标签照样执行 |
报错了对一下#
| 页面上看到 | 原因 | 怎么修 |
|---|---|---|
显示 {$article.title} 原文 | 变量名写错,或这页没有这个变量 | 对一下上面的变量表 |
显示 <?php | 模板语法错了 | 看报错提示的行号 |
正文显示 <p>文字</p> | 忘了 |raw | 加上 |raw |
显示 {endif} | 写了不存在的标签 | 删掉它 |
| 500 | {if} 没关 | 数一下 {/if} 够不够 |
| 列表一条都没有 | 列表就是空的 | 写 {if empty($list)} 提示句 |
下一步#
没找到答案?
在后台「缓存与维护 → 系统体检」里看环境是否正常;仍无解就打开
server_debug.php 复现一次,页面会直接告诉你异常文件与行号。