ThinkPHP3.2.2 分页类使用常见问题详解

浏览:5279 发布日期:2014/12/03 分类:技术分享 关键字: 分页类 bug 问题 首页 尾页 下一页 上一页 thinkPHP
最近在用thinkPHP3.2.2开发做一些简单的东西。在使用think自带的分页类时遇到了一些问题。到网上搜也没有得到想要的答案,只能仔细琢磨think分页类源码。
问题一:在某些情况下“上一页”与“下一页”不会显示
具体来说,如果当前也是第一页那么“第一页(默认<<)”的链接就不会显示(可能think觉得这样多此一举)。但是有时出于样式的统一考虑,我们希望即使当前页是第一页,也会出现“第一页”的链接。
接下来让我们看看源码:
//上一页
$up_row = $this->nowPage - 1;
$up_page = $up_row > 0 ? '<a class="prev" href="' . $this->url($up_row) . '">' . $this->config['prev'] . '</a>' : '';
源码其实很简单,如果当前页是第一页那么$up_row=0;$up_page="";所以上一页其实显示了,只不过是空串,我们可以修改一下源码,将空串改成<span class="up-page-span">上一页<span>,这样一来就会显现一个无法跳转的链接,之所以加上class是为了以后写css方便。
说完上一页,下一页相信大家都明白了。
问题二:某些情况下首页(第一页)和尾页(最后一页)无法显示。
首先我们得明确一个问题,“某些情况”是哪些情况,我做了一个小测试得出以下结论:
1.总页数非常少,首页和尾页都不会显示。
2.页数足够(具体多少也到后面你就知道了),如果当前页靠近(怎么靠近,哈哈)第一页,首页不会显示;如果当前也靠近最后一页,尾页不会显示。
话不多说,直接看源码: //第一页
$the_first = '';
if($this->totalPages > $this->rollPage && ($this->nowPage - $now_cool_page) >= 1){
$the_first = '<a class="first" href="' . $this->url(1) . '">' . $this->config['first'] . '</a>';
}
我很开心,因为我看到了 $the_first = '';和if条件句,因为这让我觉得这和问题一大同小异,事实的确如此。先说明一下,$totalPage是总页数,$rollPage分页栏每页显示的页数。如图:

中间的5-15就是rollPage,共11条,因为默认值为11。再看if条件,有两个条件:
$this->totalPages > $this->rollPage总页数大于分页栏每页显示的页数,这恰好解释了我们上面提出的情况1; ($this->nowPage - $now_cool_page) >= 1当前页减去中间页大于1,这也恰好解释了情况二。搞懂为什么“首页(尾页)”不显示,问题也就迎刃而解了,我们可以修改if条件或修改变量$the_first 的初始值,看个人喜好,这里不多言。
问题三:使用$Page->setConfig('last','尾页')设置尾页显示样式无效。
当我这样设置的时候think仍然显示的是最后一页的页码,而不是“尾页”,可笑的是“首页”正常显示了,这让我很苦恼。上网搜竟然找到了相同的提问,可惜没人回答。只能再次琢磨源码。这里就直接将结果告诉大家,但是我探索这个结果足足花了两个小时(说起来都是泪)。其实我们的确设置了last等于“尾页”,但是Page类中的show方法里面有一句莫名其妙的代码:
$this->lastSuffix && $this->config['last'] = $this->totalPages;很多小伙伴可能会觉得这是一个语法错误,一个变量怎么可以赋值给一个表达式呢?其实不是的,这就是一个普通的逻辑语句,类似与a && b,这里要讲一个名词“逻辑优化”,比如a&&b,如果a=false,不管b是false还是true都不影响最终结果(false)。因此“逻辑优化”是不会多此一举,再去判断b的。在本例中由于$this->lastSuffix 的默认值是true,最终结果无法确定,所以不满足“逻辑优化”。那么$this->config['last'] = $this->totalPages就是被执行。于是我们之前的设置“尾页”就被覆盖了,所以看到的永远是页码。解决办法其实很简单只需要将$this->lastSuffix的值改成false即可(建议在程序中该,而不是在源码中该),这样由于“逻辑优化”,赋值语句不被执行,一切就归于正常了。
但是我仍然不懂这句话到底有什么作用,似乎很多余。而且最重要的一点:对于程序而言,虽然简单就是美的,但可读性一样重要。一起努吧!

最佳答案
评论( 相关
后面还有条评论,点击查看>>