首页全局
全站通用的常量、SEO变量与公共模板调用
页面 SEO 三要素
每个页面的标题、关键词、描述,系统自动生成,放在 head 区即可。
<title>{$meta_title}</title>
<meta name="keywords" content="{$meta_keywords}">
<meta name="description" content="{$meta_description}">
站点全局常量
常量直接输出,无需加 $ 符号。THEME_PATH 指向当前主题 static 目录,用于引入 css/js/images。
{SITE_URL} 网站地址
{SITE_NAME} 网站名称
{SITE_LOGO} 网站LOGO图片
{SITE_ICP} ICP备案号
{SITE_ID} 站点ID
{THEME_PATH} 主题静态资源目录
{MOD_DIR} 当前模块目录
{IS_SHARE} 是否共享模块页面(布尔值)
<!-- 实际用法 -->
<link rel="stylesheet" href="{THEME_PATH}default/pc/css/style.css">
<img src="{SITE_LOGO}" alt="{SITE_NAME}">
引入公共模板
将头部、底部等公共部分独立成模板文件,各页面统一引用,便于维护。
{template "header.html"}
{template "footer.html"}
<!-- 引入子目录模板 -->
{template "sidebar.html"}
顶部导航循环
固定"首页"项 + 循环输出顶级栏目,含当前栏目高亮判断与二级下拉栏目。return=t2 指定内层循环的返回变量名,避免与外层 $t 冲突。
<ul class="nav navbar-nav">
<li class="{if $indexc}hover{/if}"><a href="/">首页</a></li>
{category module=share pid=0 num=5}
<li>
<a class="{if IS_SHARE && $catid && dr_in_array($catid, $t['catids'])}hover{/if}"
href="{$t['url']}" title="{$t['name']}">{$t['name']}</a>
{if $t['child']}
<ul class="sub-menu">
{category module=share pid=$t['id'] return=t2}
<li><a href="{$t2['url']}">{$t2['name']}</a></li>
{/category}
</ul>
{/if}
</li>
{/category}
会员登录状态判断
全站可用的会员变量,根据登录状态显示不同内容,常用于头部用户区。
{if $member}
已登录,欢迎您:{$member['username']}
{else}
未登录,请先登录
{/if}
文章列表循环
首页调用指定栏目的最新文章,示例含标题、所属栏目(名称+链接)、时间、点击量。module 指定模块目录,catid 指定栏目ID,order 排序字段,num 调用条数,thumb=1 只调用有缩略图的内容。
{module module=news catid=1 order=updatetime num=6 cache=1}
<div class="news-item">
<h3><a href="{$t['url']}">{$t['title']}</a></h3>
<span class="cat">所属栏目:<a href="{dr_cat_value($t['catid'], 'url')}">{dr_cat_value($t['catid'], 'name')}</a></span>
<span class="date">时间:{dr_date($t['_inputtime'], 'Y-m-d H:i:s')}</span>
<span class="hits">点击量:{intval($t['hits'])}</span>
</div>
{/module}
<!-- 带缩略图的图文列表 -->
{module module=news catid=1 thumb=1 num=4}
<li>
<img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}">
<h3><a href="{$t['url']}">{dr_strcut($t['title'], 40)}</a></h3>
<p>{dr_strcut($t['description'], 100, '...')}</p>
</li>
{/module}
栏目内容嵌套循环
首页分区布局常用:先循环栏目,再循环每个栏目下的内容。内层 module 必须加 return=t2 指定返回变量,避免与外层 $t 冲突;配合 $key 循环序号用 if 标签实现隔行变色。
<!-- 先循环栏目,再循环栏目下的内容 -->
{category module=share pid=0}
<div class="cat-box">
<h3><a href="{$t['url']}">{$t['name']}</a></h3>
<ul>
{module catid=$t['id'] order=updatetime num=5 return=t2}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">
<a href="{$t2['url']}">{$t2['title']}</a>
<span>{dr_date($t2['_inputtime'], 'Y-m-d H:i:s')}</span>
<span>{intval($t2['hits'])}次浏览</span>
</li>
{/module}
</ul>
</div>
{/category}
<!-- 隔行变色样式($key 从 0 开始,第 1、3、5... 行为 odd) -->
li.odd { background: #fff; }
li.even { background: #f6f7f9; }
单页内容标签
首页调用指定单页栏目信息:category 指定 id 即可循环输出标题、内容、链接。首页展示时内容需用 dr_clearhtml 去除HTML标签、dr_strcut 截取字数,避免单页全文过长。
<!-- 首页调用指定单页栏目(如"关于我们" ID=1) -->
{category module=share id=1}
<h3>{$t['name']}</h3> <!-- 单页标题 -->
<div class="content">{dr_strcut(dr_clearhtml($t['content']), 200, '...')}</div>
<!-- 单页内容:清除HTML标签后截取200字符,超出显示... -->
<a href="{$t['url']}">查看详情</a> <!-- 单页链接 -->
{/category}
<!-- 单页模板 page.html 内直接输出 -->
<h1>{$name}</h1>
<div class="content">{$content}</div>
轮播图标签
先在后台「网站配置 → 自定义配置」添加多文件字段(如 banner),再用 dr_site_value 读取、dr_get_file 取图片地址,配合 Bootstrap 轮播组件输出。$i 为序号,第一张加 active 类。
{php $banner = dr_site_value('banner');}
{if $banner}
<div id="carousel" class="carousel slide" data-ride="carousel">
<div class="carousel-inner">
{loop $banner $i $v}
<div class="item {if !$i}active{/if}">
<img src="{dr_get_file($v)}" alt="轮播图" style="width:100%">
</div>
{/loop}
</div>
</div>
{/if}
网站自定义配置
读取后台「网站设置」中保存的自定义配置值,如 QQ、电话等联系方式。
{php $mysite = dr_site_value('qq');}
咨询QQ:{$mysite}
<!-- 直接输出写法 -->
联系电话:{dr_site_value('phone')}
友情链接输出
读取后台配置的友情链接数组,$v[1] 为站点名称、$v[2] 为链接地址,常用于首页底部。
{php $yqlj = dr_site_value('yqlj');}
{if $yqlj}
{loop $yqlj $v}
<a href="{$v[2]}" target="_blank">{$v[1]}</a>
{/loop}
{/if}
当前年份(版权栏)
直接调用 PHP 函数,常用于页脚版权年份自动更新。
Copyright {date('Y')} © {SITE_NAME} All Rights Reserved.
备案号:<a href="https://beian.miit.gov.cn/">{SITE_ICP}</a>
栏目列表
栏目循环、面包屑、栏目变量与内容列表调用
栏目循环 category
pid 决定调用层级:pid=0 调用顶级栏目;pid=$catid 调用当前栏目子级;pid=6 调用指定ID栏目的子级。
{category module=share pid=0}
<a href="{$t['url']}" title="{$t['name']}">{$t['name']}</a>
{/category}
<!-- 调用当前栏目的子栏目 -->
{category module=share pid=$catid}
<a href="{$t['url']}">{$t['name']}</a>
{/category}
面包屑导航
输出当前位置路径:先输出网站首页链接,再用 dr_catpos 循环输出栏目层级。[url] 与 [name] 为系统占位符,外层的 HTML 标签可自由替换。
<a href="{SITE_URL}">网站首页</a> > {dr_catpos($catid, '', true, '<a href="[url]">[name]</a> > ')}
当前栏目变量
列表页/详情页中当前栏目的常用字段,$top 表示当前栏目的顶级栏目。
{$cat['id']} 栏目ID
{$cat['name']} 栏目名称
{$cat['url']} 栏目链接
{$cat['thumb']} 栏目缩略图
{$cat['description']} 栏目描述
{if $top['child']}有子栏目{/if}
兄弟栏目循环
输出当前栏目同级的其他栏目,常用于侧栏分类导航,可对当前栏目做高亮判断。
{if $top['child']}
{loop $related $c}
<li {if $c['id']==$cat['id']}class="hover"{/if}>
<a href="{$c['url']}">{$c['name']}</a>
</li>
{/loop}
{/if}
栏目内容列表(带分页)
列表页标准写法:catid=$catid 调用当前栏目内容,示例含标题、所属栏目、时间、点击量;page=1 开启分页,配合 $pages 输出分页条,分页条样式见下方 CSS。
{module catid=$catid order=updatetime page=1}
<li>
<a href="{$t['url']}">{$t['title']}</a>
<span class="cat"><a href="{dr_cat_value($t['catid'], 'url')}">{dr_cat_value($t['catid'], 'name')}</a></span>
<span class="date">{dr_date($t['_inputtime'], 'Y-m-d H:i:s')}</span>
<span class="hits">{intval($t['hits'])}次浏览</span>
</li>
{/module}
<div class="page">{if $nums>1}{$pages}{/if}</div>
/* 分页条样式:$pages 输出的结构为 ul.pagination,可直接配合使用 */
.page { text-align: center; margin: 30px 0; }
.page .pagination { display: inline-block; padding-left: 0; margin: 0; list-style: none; }
.page .pagination > li { display: inline-block; margin: 0 4px; }
.page .pagination > li a,
.page .pagination > li span {
display: block; padding: 8px 14px; font-size: 14px; color: #5a6178;
background: #fff; border: 1px solid #e8ecf3; border-radius: 6px;
-webkit-transition: all .25s; transition: all .25s;
}
.page .pagination > li a:hover { color: #2f82ff; border-color: #2f82ff; background: #f0f6ff; text-decoration: none; }
.page .pagination > li.active span { color: #fff; background: #2f82ff; border-color: #2f82ff; }
.page .pagination > li.disabled span { color: #c3c9d6; background: #f6f7f9; cursor: not-allowed; }
指定栏目/模块调用
任意页面调用指定栏目的内容。order=updatetime 按更新时间,order=hits 按点击量;cache=1 开启数据缓存;示例含所属栏目、时间、点击量输出。
<!-- 调用新闻模块ID为1的栏目,最新6条 -->
{module module=news catid=1 order=updatetime num=6 cache=1 return=t}
<li>
<a href="{$t['url']}">{$t['title']}</a>
<span><a href="{dr_cat_value($t['catid'], 'url')}">{dr_cat_value($t['catid'], 'name')}</a></span>
<span>{dr_date($t['_inputtime'], 'Y-m-d H:i:s')}</span>
<span>{intval($t['hits'])}次点击</span>
</li>
{/module}
<!-- 按点击量调用热门内容 -->
{module catid=$catid order=hits num=10}
<a href="{$t['url']}">{$t['title']}</a>
{/module}
通过栏目ID取值
已知栏目ID时,直接读取该栏目的任意字段,常用于列表页显示内容所属栏目。
<!-- 取内容所属栏目的名称和链接 -->
栏目名称:{dr_cat_value($t['catid'], 'name')}
栏目链接:{dr_cat_value($t['catid'], 'url')}
<!-- 取指定ID(如ID为5)的栏目名称 -->
{dr_cat_value(5, 'name')}
内容详情
详情页字段、Tag输出、上下篇与相关内容推荐
内容基础字段
详情页直接可用的内容变量。自定义字段同样直接用字段英文名输出。
{$title} 内容标题
{$keywords} 关键词
{$description} 描述
{$inputtime} 发布时间
{$updatetime} 更新时间
{$hits} 点击量
{$content} 正文内容
{$cat['name']} 所属栏目名
自定义字段:{$字段英文名}(如 {$zuozhe})
缩略图判断输出
先判断缩略图是否存在,避免出现裂图;dr_thumb 可按宽高裁剪生成缩略图。
{if $thumb}
<img src="{dr_thumb($thumb, 300, 200)}" alt="{$title}">
{else}
<img src="{THEME_PATH}default/pc/images/nopic.jpg" alt="{$title}">
{/if}
<!-- 不裁剪,输出原图 -->
<img src="{dr_thumb($t['thumb'])}" alt="{$t['title']}">
内容Tag输出
详情页循环输出本文标签,$name 为标签名、$url 为标签链接;列表页可先用 dr_get_content_tags 转换。
<!-- 详情页:本文标签 -->
{loop $tags $name $url}
<a href="{$url}" target="_blank">{$name}</a>
{/loop}
<!-- 列表页:将关键词转为Tag链接 -->
{php $kws = dr_get_content_tags($t['keywords']);}
{if $kws}{loop $kws $name $url}
<a href="{$url}">{$name}</a>
{/loop}{/if}
上一篇 / 下一篇
系统内置变量,直接判断是否存在并输出标题与链接,无内容时显示"没有了"。
<p>上一篇:{if $prev_page}<a href="{$prev_page['url']}">{$prev_page['title']}</a>{else}没有了{/if}</p>
<p>下一篇:{if $next_page}<a href="{$next_page['url']}">{$next_page['title']}</a>{else}没有了{/if}</p>
相关内容推荐
按关键词自动匹配相关内容。NOT_id=$id 表示排除当前内容自身。
{related module=MOD_DIR catid=$catid tag=$tag NOT_id=$id num=4}
<div class="item">
<a href="{$t['url']}">{$t['title']}</a>
<p>{dr_strcut($t['description'], 200, '...')}</p>
</div>
{/related}
搜索表单
站内搜索表单、搜索结果循环与参数处理
站内搜索表单
系统内置 JS 函数 dr_module_search,回车或点击按钮即可跳转到当前模块的搜索结果页。
<input type="text" name="keyword" value="{$keyword}"
id="search_keyword" placeholder="搜索关键词..."
onkeypress="if(event.keyCode==13) {dr_module_search('search_keyword');return false;}">
<button type="button" onclick="dr_module_search('search_keyword')">搜索</button>
GET 方式提交表单
不依赖 JS 的表单写法,固定参数 s=api、c=api、m=search,dir 指定模块目录。
<form action="/index.php" method="get">
<input type="hidden" name="s" value="api">
<input type="hidden" name="c" value="api">
<input type="hidden" name="m" value="search">
<input type="hidden" name="dir" value="{MOD_DIR}">
<input type="text" name="keyword" placeholder="请输入关键词">
<button type="submit">搜索</button>
</form>
搜索结果循环
搜索结果页(search.html)专用,id=$searchid 为本次搜索ID,pagesize 控制每页条数。
{search module=MOD_DIR id=$searchid total=$sototal order=$params['order']
catid=$catid page=1 pagesize=12 urlrule=$urlrule}
<div class="item">
<img src="{dr_thumb($t['thumb'])}" alt="">
<h3><a href="{$t['url']}">{$t['title']}</a></h3>
<p>{dr_strcut($t['description'], 80)}</p>
</div>
{/search}
<div class="page">{$pages}</div>
搜索参数与排序链接
$keyword 为当前搜索词,$params 为搜索参数数组,Router::search_url 用于生成带参数的排序链接。
当前关键词:{$keyword}
共找到 {$sototal} 条相关结果
<!-- 切换排序方式 -->
<a href="{Router::search_url($params, 'order', 'hits')}">按浏览量排序</a>
<a href="{Router::search_url($params, 'order', 'support')}">按支持量排序</a>
其他杂项
条件判断、循环、PHP语句与常用工具函数
条件判断 if
支持多分支判断,注意 else if 之间有空格,结尾必须用 {/if} 闭合。
{if $catid == 1}
当前是ID为1的栏目
{else if $catid == 2}
当前是ID为2的栏目
{else}
其他栏目
{/if}
<!-- 判断是否首页 -->
{if $indexc}这是首页{/if}
循环 loop
两种形式:只要值、或同时取键和值(如 Tag 的 名称=>链接)。
<!-- 只取值 -->
{loop $arr $v}
{$v['title']}
{/loop}
<!-- 同时取键值:$name 键、$url 值 -->
{loop $tags $name $url}
<a href="{$url}">{$name}</a>
{/loop}
变量运算与循环序号
变量支持四则运算与比较运算;循环中 $key 为当前序号(从0开始),可用于隔行换色等场景。
{$num+1} 变量加常数
{if $a>$b}大于{else}不大于{/if} 比较运算
<!-- 循环序号 $key 应用:隔行换色 -->
{loop $arr $v}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">{$v['title']}</li>
{/loop}
PHP 语句
可在模板中直接执行任意 PHP 代码,一般用于数据处理后再输出。
{php $yqlj = dr_site_value('yqlj');}
{php echo date('Y-m-d H:i:s');}
{php print_r($cat);} <!-- 调试输出当前栏目信息 -->
模板注释
注释内容不会输出到页面源码中,仅模板制作时给自己看。
{/* 这里是注释,不会输出到页面 */}
常用工具函数速查
模板制作中使用频率最高的几个工具函数,建议收藏。
{dr_date($inputtime, 'Y-m-d H:i:s')} 时间戳格式化
{dr_strcut($title, 30, '...')} 字符串截取
{dr_thumb($thumb, 300, 200)} 缩略图裁剪
{intval($hits)} 转为整数
{dr_in_array($catid, $t['catids'])} 值是否在数组中
{dr_get_content_tags($t['keywords'])} 关键词转Tag
{dr_site_value('字段名')} 读网站配置
{dr_cat_value(栏目ID, '字段')} 读栏目字段
Tag 标签云
调用全站标签,order=rand 随机排序,$key 为循环序号(从0开始),可用于隔行换色。
{tag num=20 order=rand}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">
<a href="{$t['url']}" target="_blank">{$t['name']}</a>
</li>
{/tag}
