在平时的项目中,我们常常会遇到下述的一种情况:
在文章详情页的底部位置,有上一篇、下一篇文章。
初次遇到此类问题,习惯性的按照前辈的处理思路
http://www.jb51.net/article/58286.htm
//上一篇
$front=$Article->where("id<".$id)->order('id desc')->limit('1')->find();
$this->assign('front',$front);
//下一篇
$after=$Article->where("id>".$id)->order('id desc')->limit('1')->find();
$this->assign('after',$after);
即:根据条件查找出此文章id的前后文章。看似正确的思路,其实存在着一些小问题。
本人在调用文章列表的时候,一般有个排序依据,首先根据管理员设定的文章排序(listorder字段)进行排序,当管理员后台设定的排序相同时,再根据文章发布的时间进行排序,即:
$list = $Model->where($map)->field('id,sm_images,title,author,show_time,description')->order('listorder,show_time DESC')->limit($Page->firstRow.','.$Page->listRows)->select();
此种情况若单单根据文章的id进行调用id相邻的两篇文章,就不合理了。
列如:
id title listorder
1 西游记 3
2 水浒传 2
3 红楼梦 1
4 三国演义 4
5 鬼吹灯 5
我们调用文章列表时,根据listorder的正序排列,得到的文章依次为:红楼梦、水浒传、西游记、三国演义、鬼吹灯
如果我们当前正在阅读西游记,那么他前后的文章应该为 前一篇:水浒传 后一篇:三国演义
但是按照前后id为:前一篇:无 后一篇:水浒传,就不符合要求了
所以,我们应该根据他的排序条件来确定他的上一篇和下一篇
//获取上一篇、下一篇文章
$map['cat_id'] = $data['cat_id'];
$map['id'] = array('neq',$id);
$map['listorder'] = array('elt',$data['listorder']);
$map['show_time'] = array('egt',$data['show_time']);
$data['prev'] = M('Article')->where($map)->order('listorder,show_time DESC')->field('id,title,show_time,listorder')->find();
$map['listorder'] = array('egt',$data['listorder']);
$map['show_time'] = array('elt',$data['show_time']);
$data['next'] = M('Article')->where($map)->order('listorder,show_time DESC')->field('id,title,show_time,listorder')->find();