大家好,有同学反馈是否列表页的帖子不要全部显示只显示预定的时间段帖子数量?,有没有什么可调用的方法,以本人目前认知是没有此类的设置和调用标签。以下是小秋自己捣鼓出来的,只分享不保证,经过测试完成完美实现。现在跟的步骤来做:
打开\core\library\think\template\taglib
eyou.php文件:大概36新
'list' => ['attr' => 'modelid,channelid,typeid,notypeid,pagesize,row,loop,keyword,titlelen,orderby,ordermode,orderway,noflag,flag,bodylen,infolen,empty,mod,id,key,addfields,thumb,arcrank,idlist,idrange,siteall'],
修改为:
'list' => ['attr' => 'modelid,channelid,typeid,notypeid,pagesize,row,loop,keyword,titlelen,orderby,ordermode,orderway,noflag,flag,bodylen,infolen,empty,mod,id,key,addfields,thumb,arcrank,idlist,idrange,siteall,timewode'],
继续查找(938行左右)
public function tagList($tag, $content)
在里面的内容的:
$keyword = isset($tag['keyword']) ? $tag['keyword'] : '';
$keyword = $this->varOrvalue($keyword);
下面新增:
$timewode = isset($tag['timewode']) ? $tag['timewode'] : '';
$timewode = $this->varOrvalue($timewode);
继续往下查找:
// 查询数据库获取的数据集
$parseStr .= ' $param = array(';
$parseStr .= ' "typeid"=> $typeid,';
$parseStr .= ' "notypeid"=> '.$notypeid.',';
$parseStr .= ' "flag"=> "'.$flag.'",';
$parseStr .= ' "noflag"=> "'.$noflag.'",';
$parseStr .= ' "channel"=> $modelid,';
$parseStr .= ' "keyword"=> '.$keyword.',';
$parseStr .= ' "idlist"=> '.$idlist.',';
$parseStr .= ' "idrange"=> '.$idrange.',';
下面新增:
$parseStr .= ' "timewode"=> '.$timewode.',';
保存 本页结束:
打开:\core\library\think\template\taglib\eyou
TagList.php文件
查找:
public function getList($param = array(), $pagesize = 10, $orderby = '', $addfields = '', $ordermode = '', $thumb = '', $arcrank = '',$siteall = null)
在这个函数里面我们继续往下查找:
$condition = array();
foreach (array('keywords','keyword','typeid','notypeid','flag','noflag','channel') as $key) {
修改为:
$condition = array();
foreach (array('keywords','keyword','typeid','notypeid','flag','noflag','channel','timewode') as $key) {
继续往下查找:
elseif ($key == 'keyword' && trim($param[$key])) {
$keyword = str_replace(',', ',', $param[$key]);
$keywordArr = explode(',', $keyword);
$keywordArr = array_unique($keywordArr); // 去重
foreach ($keywordArr as $_k => $_v) {
$_v = trim($_v);
if (empty($_v)) {
unset($keywordArr[$_k]);
break;
} else {
$keywordArr[$_k] = addslashes($_v);
}
}
$keyword = implode('|', $keywordArr);
$condition[] = Db::raw(" CONCAT(a.title,a.seo_keywords) REGEXP '$keyword' ");
}
下面增加:
elseif ($key == 'timewode' && trim($param[$key])) {
$timewode = trim($param[$key]);
$num = 0;
$unit = 'd';
$startTime = 0;
if (preg_match('/^(\d+)$/', $timewode, $matches)) {
$num = intval($matches[1]);
}
elseif (preg_match('/^(\d+)([dwmqy])$/i', $timewode, $matches)) {
$num = intval($matches[1]);
$unit = strtolower($matches[2]);
}
if ($num > 0) {
$archivesModel = Db::name('archives');
$archivesModel->where('status', 1);
$lastPostTime = $archivesModel->max('add_time');
$originalEndTime = $lastPostTime > 0 ? $lastPostTime : time();
$endTime = strtotime(date('Y-m-d 23:59:59', $originalEndTime));
switch ($unit) {
case 'd': // 天
$startTime = $endTime - $num * 86400;
break;
case 'w': // 周(1周=7天)
$startTime = $endTime - $num * 86400 * 7;
break;
case 'm': // 月(1月=30天)
$startTime = $endTime - $num * 86400 * 30;
break;
case 'q': // 季度(1季度=3个月)
$startTime = $endTime - $num * 86400 * 30 * 3;
break;
case 'h': // 半年(1半年=6个月)
$startTime = $endTime - $num * 86400 * 30 * 6;
break;
case 'y': // 年(1年=365天)
$startTime = $endTime - $num * 86400 * 365;
break;
}
// 添加时间范围查询条件
if ($startTime > 0) {
$condition[] = "a.add_time >= {$startTime}";
}
}
}
保存即可 核心文件已经完成:
调用方式与正常标签一样,如果需要用时间筛选或者就是规定时间内显示的所在时间的文档就在标签参数里面新增:timewode='' 即可:
timewode='' 时间范围内的所有帖子,单位格式:d为天,w为周,m为月,q为季度,h为半年,y为年【数+单位】 。如果不写单位表示实际天数。
举例说明【写多少时间显示多少天的帖子】:7天
{eyou:list loop='10' id='field2' timewode='7d'}
<a href='{$field2.arcurl}'>{$field2.title}</a>
{/eyou:list}
不写单位的:3天
{eyou:list loop='10' id='field2' timewode='3' }
<a href='{$field2.arcurl}'>{$field2.title}</a>
{/eyou:list}
一个月:
{eyou:list loop='10' id='field2' timewode='1m' }
<a href='{$field2.arcurl}'>{$field2.title}</a>
{/eyou:list}
一年:
{eyou:list loop='10' id='field2' timewode='1y' }
<a href='{$field2.arcurl}'>{$field2.title}</a>
{/eyou:list}