网站开发过程中经常遇见上一篇下一篇问题的处理,今天刚好在做一个项目的时候也遇到了,这个是对自己以前方法的改进,可能会存在没有考虑到的问题,请大家可以在这个基础上改进
首先,当我们去访问一篇文章的时候需要在路由中传递这个文章的id以及这篇文章所属的栏目,id,cateid
要保证显示的上一篇和下一篇文章和当前文章是同一个栏目下的文章,会有一个方法显示某一篇文章的具体信息
例如这样:
// 话题内容页public function index(){$topics = D('TopartView'); $cateid = I('cateid'); $arid = I('arid'); // 调用分页方法(上一页下一页) $this->pages($arid,$cateid); $content = $topics->where(array('id'=>$arid))->find(); if($content) {// 浏览次数 $topics->where(array('id'=>$arid))->setInc('click',1); $this->assign('content',$content); $this->display(); }else {$this->error('非法操作',U('account/login')); }}
可以看到这个方法里面也接收了id,cateid两个参数 ,有一个方法pages,这个方法就是调用上一篇下一篇文章的
具体实现方法如下:
/* * $id 当前文章id * $cateid 当前文章所属栏目id * */public function pages($id,$cateid) {$topic = D('Topic'); // 下一页查询条件 $where = array('id' => array('gt',$id), 'cateid' => array('eq',$cateid), ); $next_topic = $topic->order('id asc')->where($where)->limit(1)->select(); if($next_topic) {$next_topic = $next_topic[0]; }else {$next_topic = null; }// 下一篇查询条件 $where = array('id' => array('lt',$id), 'cateid' => array('eq',$cateid), ); $prev_topic = $topic->order('id desc')->where($where)->limit(1)->select(); if($prev_topic) {$prev_topic = $prev_topic[0]; }else {$prev_topic = null; }$this->assign('prev_topic',$prev_topic); $this->assign('next_topic',$next_topic);}
这个方法的核心在于where条件的使用,显示下一页的时候必须保证id是要大于当前文章的id,同样上一篇的id需要小于当前文章的id,并且这里还有一个需要注意的问题是每一篇文章并不是连续的,有的文章可能被删除了,所以在查询的时候记得排序一下,查询下一篇的时候就是按照升序,查询下一篇的时候就是按照降序,然后就是数据的分配了,整个过程就是这样