首页全局
全站通用的常量、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
{SITE_MURL} 移动端网站地址
{THEME_PATH} 主题静态资源目录
{MOD_DIR} 当前模块目录
{IS_SHARE} 是否共享模块页面(布尔值)
{ROOT_URL} 根域名地址
[note] 实际用法(尖括号已转义,避免被浏览器当标签解析) [/note]
<link rel="stylesheet" href="{THEME_PATH}default/pc/css/style.css">
<img src="{SITE_LOGO}" alt="{SITE_NAME}">
引入公共模板
将头部、底部等公共部分独立成模板文件,各页面统一引用,便于维护。
{template "header.html"}
{template "footer.html"}
[note] 引入子目录模板 [/note]
{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=3600}
<div class="news-item">
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<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}
[note] 带缩略图的图文列表 [/note]
{module module=news catid=1 thumb=1 num=4 cache=3600}
<li>
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<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 标签实现隔行变色。
[note] 先循环栏目,再循环栏目下的内容 [/note]
{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 cache=3600}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">
<p><img src="{dr_thumb($t2['thumb'], 220, 150)}" alt="{$t2['title']}"></p>
<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}
[note] 隔行变色样式($key 从 0 开始,第 1、3、5... 行为 odd) [/note]
li.odd { background: #fff; }
li.even { background: #f6f7f9; }
单页内容标签
首页调用指定单页栏目信息:category 指定 id 即可循环输出标题、内容、链接。首页展示时内容需用 dr_clearhtml 去除HTML标签、dr_strcut 截取字数,避免单页全文过长。
[note] 首页调用指定单页栏目(如"关于我们" ID=1) [/note]
{category module=share id=1}
<h3>{$t['name']}</h3> [note] 单页标题 [/note]
<div class="content">{dr_strcut(dr_clearhtml($t['content']), 200, '...')}</div>
[note] 单页内容:清除HTML标签后截取200字符,超出显示... [/note]
<a href="{$t['url']}">查看详情</a> [note] 单页链接 [/note]
{/category}
[note] 单页模板 page.html 内直接输出 [/note]
<h1>{$name}</h1>
<div class="content">{$content}</div>
单条内容调用 content
调用文章的详细字段(含附表)单条数据。id 为文档ID,module 为模块名称。
{content id=1 module=news}
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<h3>{$t['title']}</h3>
<div>{dr_strcut(dr_clearhtml($t['content']), 200, '...')}</div>
<a href="{$t['url']}">查看详情</a>
{/content}
单页标签(按ID取值)
首页直接调用指定单页栏目(如"关于我们"ID=1)的标题、链接、正文。dr_cat_value 第一参数为模块(单页多在 share),第二参数为栏目ID,第三参数为字段名;dr_clearhtml 去除正文HTML标签,dr_strcut 截取 320 字符、超出显示 ...。
<div class="box">
<h3><a href="{dr_cat_value('share',1,'url')}">{dr_cat_value('share',1,'name')}</a></h3>
<p>{dr_strcut(dr_clearhtml(dr_cat_value('share',1,'content')), 320, '...')}</p>
<a href="{dr_cat_value('share',1,'url')}">查看更多</a>
</div>
幻灯片标签(Swiper)
先在后台「网站配置 → 自定义配置」添加多文件字段(如 hdtp)。$v[1] 为图片附件ID、$v[2] 为图片标题/名称,配合 Swiper 轮播组件输出。
<?php $hdtp=dr_site_value('hdtp');?>
{loop $hdtp $v}<div class="swiper-slide"><img src="{dr_get_file($v[1])}" alt="{$v[2]}" /></div>{/loop}
网站自定义配置
读取后台「网站设置」中保存的自定义配置值,如 QQ、电话等联系方式。
{php $mysite = dr_site_value('qq');}
咨询QQ:{$mysite}
[note] 直接输出写法 [/note]
联系电话:{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}
当前年份(版权栏)
调用系统时间函数输出年份,常用于页脚版权年份自动更新。
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}
[note] 调用当前栏目的子栏目 [/note]
{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']} 栏目缩略图(需 dr_get_file 输出)
{$cat['description']} 栏目描述
{$top['id']} 顶级栏目ID
{$top['name']} 顶级栏目名称
{$top['url']} 顶级栏目链接
{$top['thumb']} 顶级栏目缩略图
{$top['description']} 顶级栏目描述
{$top['child']} 顶级栏目是否有子栏目
{$top['catids']} 顶级栏目及子栏目ID数组
{$parent['id']} 父级栏目ID
{$parent['name']} 父级栏目名称
{$parent['url']} 父级栏目链接
{if $top['child']}有子栏目{/if}
[note] 输出顶级栏目缩略图 [/note]
<img src="{dr_get_file($top['thumb'])}" alt="{$top['name']}">
兄弟栏目循环
输出当前栏目同级的其他栏目,常用于侧栏分类导航,可对当前栏目做高亮判断。
{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 pagesize=10 cache=3600}
<li>
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<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>
[note] 分页条样式:$pages 输出的结构为 ul.pagination,可直接配合使用 [/note]
.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 a { color: #fff; border-color: #0032a0; background: #0032a0; 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 开启数据缓存;示例含所属栏目、时间、点击量输出。
[note] 调用新闻模块ID为1的栏目,最新6条 [/note]
{module module=news catid=1 order=updatetime num=6 cache=3600 return=t}
<li>
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<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}
[note] 按点击量调用热门内容 [/note]
{module catid=$catid order=hits num=10 cache=3600}
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<a href="{$t['url']}">{$t['title']}</a>
{/module}
[note] 多栏目调用(逗号分隔) [/note]
{module catid=1,2,3 order=updatetime num=8}
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<a href="{$t['url']}">{$t['title']}</a>
{/module}
通过栏目ID取值
已知栏目ID时,直接读取该栏目的任意字段,常用于列表页显示内容所属栏目。
[note] 取内容所属栏目的名称和链接 [/note]
栏目名称:{dr_cat_value($t['catid'], 'name')}
栏目链接:{dr_cat_value($t['catid'], 'url')}
[note] 取指定ID(如ID为5)的栏目名称 [/note]
{dr_cat_value(5, 'name')}
[note] 共享模块写法 [/note]
{dr_share_cat_value(10, 'content')}
内容详情
详情页字段、Tag输出、上下篇与相关内容推荐
内容基础字段
详情页直接可用的内容变量。自定义字段同样直接用字段英文名输出。
{$title} 内容标题
{$keywords} 关键词
{$description} 描述
{$author} 来源/笔名
{$inputtime} 发布时间(时间戳)
{$updatetime} 更新时间(时间戳)
{dr_show_hits($id)} 点击量
{$content} 正文内容
{$cat['name']} 所属栏目名
{$comments} 评论数
{$favorites} 收藏数
{$support} 支持数
{$oppose} 反对数
{$my_web_url} 当前页面地址
自定义字段:{$字段英文名}(如 {$zuozhe})
[note] 格式化时间 [/note]
{dr_date($inputtime, 'Y-m-d')}
{dr_date($updatetime, 'Y-m-d H:i')}
缩略图判断输出
先判断缩略图是否存在,避免出现裂图;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}
[note] 不裁剪,输出原图 [/note]
<img src="{dr_get_file($thumb)}" alt="{$title}">
[note] 列表页判断缩略图 [/note]
{if $t['thumb']}
<img src="{dr_thumb($t['thumb'], 200, 150)}" alt="{$t['title']}">
{else}
无图
{/if}
内容Tag输出
详情页循环输出本文标签,$name 为标签名、$url 为标签链接;列表页可先用 dr_get_content_tags 转换。
[note] 详情页:本文标签 [/note]
{loop $tags $name $url}
<a href="{$url}" target="_blank">{$name}</a>
{/loop}
[note] 列表页:将关键词转为Tag链接 [/note]
{php $kws = dr_get_content_tags($t['keywords']);}
{if $kws}{loop $kws $name $url}
<a href="{$url}">{$name}</a>
{/loop}{/if}
[note] 标签云循环 tag 标签 [/note]
{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}
上一篇 / 下一篇
系统内置变量,直接判断是否存在并输出标题与链接,无内容时显示"没有了"。
<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">
<p><img src="{dr_thumb($t['thumb'], 220, 150)}" alt="{$t['title']}"></p>
<a href="{$t['url']}">{$t['title']}</a>
<p>{dr_strcut($t['description'], 200, '...')}</p>
</div>
{/related}
提取正文图片
从内容字段中提取全部图片或指定数量图片,常用于图集展示、图文混排提取。
[note] 提取正文全部图片 [/note]
{php $imgs = dr_get_content_img($content);}
{loop $imgs $img}
<img src="{$img}" alt="{$title}">
{/loop}
[note] 提取前3张图片 [/note]
{php $imgs = dr_get_content_img($content, 3);}
{loop $imgs $img}
<img src="{$img}">
{/loop}
搜索表单
站内搜索表单、搜索结果循环与参数处理
站内搜索表单
系统内置 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} 条相关结果
[note] 切换排序方式 [/note]
<a href="{Router::search_url($params, 'order', 'hits')}">按浏览量排序</a>
<a href="{Router::search_url($params, 'order', 'support')}">按支持量排序</a>
其他杂项
条件判断、循环、PHP语句与常用工具函数
常用 if 判断语句
模板中高频使用的条件判断,涵盖首页、栏目、详情、会员、字段等场景。
[note] 判断是否首页 [/note]
{if $indexc}这是首页{/if}
[note] 判断是否栏目页 [/note]
{if $catid && !$id}这是栏目页{/if}
[note] 判断是否详情页 [/note]
{if $id}这是详情页{/if}
[note] 判断会员是否登录 [/note]
{if $member}已登录{else}未登录{/if}
[note] 判断是否有缩略图 [/note]
{if $t['thumb']}有缩略图{else}无缩略图{/if}
[note] 判断字段是否为空 [/note]
{if $t['description']}有描述{else}无描述{/if}
[note] 判断当前栏目ID [/note]
{if $catid==1}新闻栏目{else if $catid==2}产品栏目{/if}
[note] 判断是否在指定栏目数组中 [/note]
{if dr_in_array($catid, array(1,2,3))}在指定栏目内{/if}
[note] 判断循环序号 [/note]
{if ($key+1)%2==1}奇数行{else}偶数行{/if}
[note] 判断是否存在上一篇/下一篇 [/note]
{if $prev_page}有上一篇{/if}
{if $next_page}有下一篇{/if}
循环 loop
两种形式:只要值、或同时取键和值(如 Tag 的 名称=>链接)。循环中自动提供 $key(序号,从0开始)、$is_first(是否第一条)、$is_last(是否最后一条)辅助变量。
[note] 只取值 [/note]
{loop $arr $v}
{$v['title']}
{/loop}
[note] 同时取键值:$name 键、$url 值 [/note]
{loop $tags $name $url}
<a href="{$url}">{$name}</a>
{/loop}
[note] 循环序号与首尾判断 [/note]
{loop $arr $v}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">
{if $is_first}第一条{/if}
{$v['title']}
{if $is_last}最后一条{/if}
</li>
{/loop}
dr_date 时间格式化
将时间戳格式化为可读日期。支持 PHP date 格式参数:Y年、m月、d日、H时、i分、s秒等。
{dr_date($inputtime, 'Y-m-d H:i:s')} 完整日期时间
{dr_date($inputtime, 'Y-m-d')} 仅日期
{dr_date($inputtime, 'm-d')} 月日
{dr_date($inputtime, 'Y年m月d日')} 中文格式
{dr_date($t['_inputtime'], 'Y-m-d')} 列表循环中使用
dr_strcut 字符串截取
截取字符串或文字标题长度,第三个参数为省略符(默认 ...)。
{dr_strcut($title, 30)} 截取30字,尾部...
{dr_strcut($title, 30, '>>>')} 截取30字,尾部>>>
{dr_strcut($description, 100, '')} 截取100字,无省略符
{dr_strcut($t['title'], 40)} 列表循环中使用
dr_thumb 缩略图裁剪
参数:图片ID, 宽度, 高度, 是否水印, 缩放标准值, 是否下载远程图片。生成静态图片,参数变更后需删缓存。
{dr_thumb($thumb, 300, 200)} 裁剪为300x200
{dr_thumb($thumb, 200, 200, 1)} 带水印
{dr_thumb($t['thumb'], 220, 150)} 列表循环中使用
{dr_get_file($thumb)} 输出原图
变量运算与循环序号
变量支持四则运算与比较运算;循环中 $key 为当前序号(从0开始),可用于隔行换色等场景。
{$num+1} 变量加常数
{if $a>$b}大于{else}不大于{/if} 比较运算
[note] 循环序号 $key 应用:隔行换色 [/note]
{loop $arr $v}
<li class="{if ($key+1)%2==1}odd{else}even{/if}">{$v['title']}</li>
{/loop}
PHP 语句
可在模板中直接执行 PHP 代码,一般用于数据处理后再输出(需后台开启 PHP 标签权限)。
{php $yqlj = dr_site_value('yqlj');}
{php echo date('Y-m-d H:i:s');}
模板注释
注释内容不会输出到页面源码中,仅模板制作时给自己看。
[note] 这里是注释,不会输出到页面,仅模板制作时给自己看 [/note]
模块标签参数速查
module、category 等循环标签的通用参数汇总。
module 模块名称(如 news),默认当前模块
catid 栏目ID,多个用逗号分隔(如 1,2,3)
field 指定查询字段,提升性能
order 排序方式,如 updatetime_desc、hits_desc
num 显示数量,支持 1,2 表示从第1条取2条
page=1 开启分页
pagesize 每页数量
cache 缓存秒数,如 cache=3600
return 返回变量名,默认 t,可自定义避免冲突
thumb=1 只调用有缩略图的内容
flag 推荐位ID筛选
not_flag 排除推荐位
more=1 查询栏目模型字段
常用工具函数速查
模板制作中使用频率最高的几个工具函数,建议收藏。
{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}
