分页几乎在所有的web开发中都会遇到,其实我们可以把分页分为两个问题来处理:分页导航和分页数据。分页数据,只需要根据当前页码获取相应的数据即可,不是什么大问题。要说有问题的还是分页导航。
鉴于前面写的关于phpcmsv9 tags页面静态化分页问题,今天就借phpcmsv9中自带的分页函数教大家一个生成分页导航的快捷方式。
phpcmsv9的分页函数如下:
/**
* 分页函数 (分页主函数)
*
* @param $num 信息总数
* @param $curr_page 当前分页
* @param $perpage 每页显示数
* @param $urlrule URL规则
* @param $array 需要传递的数组,用于增加额外的方法
* @return 分页
*/
function pages($num, $curr_page, $perpage = 20, $urlrule = '', $array = array(),$setpages = 10) {
if(defined('URLRULE') && $urlrule == '') {
$urlrule = URLRULE;
$array = $GLOBALS['URL_ARRAY'];
} elseif($urlrule == '') {
$urlrule = url_par('page={$page}');
}
$multipage = '';
if($num > $perpage) {
$page = $setpages+1;
$offset = ceil($setpages/2-1);
$pages = ceil($num / $perpage);
if (defined('IN_ADMIN') && !defined('PAGES')) define('PAGES', $pages);
$from = $curr_page - $offset;
$to = $curr_page + $offset;
$more = 0;
if($page >= $pages) {
$from = 2;
$to = $pages-1;
} else {
if($from <= 1) {
$to = $page-1;
$from = 2;
} elseif($to >= $pages) {
$from = $pages-($page-2);
$to = $pages-1;
}
$more = 1;
}
$multipage .= '<a class="a1">'.$num.L('page_item').'</a>';
if($curr_page>0) {
$multipage .= ' <a href="'.pageurl($urlrule, $curr_page-1, $array).'" class="a1">'.L('previous').'</a>';
if($curr_page==1) {
$multipage .= ' <span>1</span>';
} elseif($curr_page>6 && $more) {
$multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>..';
} else {
$multipage .= ' <a href="'.pageurl($urlrule, 1, $array).'">1</a>';
}
}
for($i = $from; $i <= $to; $i++) {
if($i != $curr_page) {
$multipage .= ' <a href="'.pageurl($urlrule, $i, $array).'">'.$i.'</a>';
} else {
$multipage .= ' <span>'.$i.'</span>';
}
}
if($curr_page<$pages) {
if($curr_page<$pages-5 && $more) {
$multipage .= ' ..<a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>';
} else {
$multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>';
}
} elseif($curr_page==$pages) {
$multipage .= ' <span>'.$pages.'</span> <a href="'.pageurl($urlrule, $curr_page, $array).'" class="a1">'.L('next').'</a>';
} else {
$multipage .= ' <a href="'.pageurl($urlrule, $pages, $array).'">'.$pages.'</a> <a href="'.pageurl($urlrule, $curr_page+1, $array).'" class="a1">'.L('next').'</a>';
}
}
return $multipage;
}
/**
* 返回分页路径(分页路径处理)
*
* @param $urlrule 分页规则
* @param $page 当前页
* @param $array 需要传递的数组,用于增加额外的方法
* @return 完整的URL路径
*/
function pageurl($urlrule, $page, $array = array()) {
if(strpos($urlrule, '~')) {
$urlrules = explode('~', $urlrule);
$urlrule = $page < 2 ? $urlrules[0] : $urlrules[1];
}
$findme = array('{$page}');
$replaceme = array($page);
if (is_array($array)) foreach ($array as $k=>$v) {
$findme[] = '{$'.$k.'}';
$replaceme[] = $v;
}
$url = str_replace($findme, $replaceme, $urlrule);
$url = str_replace(array('http://','//','~'), array('~','/','http://'), $url);
return $url;
}v9的生成分页导航功能分为两个函数,一个主函数,一个是分页路径处理,而分页导航最大的问题就是分页路径。而v9的分页导航功能帮我们解决了这个问题,因此,我们可以直接拿它这个分页导航功能到其他web项目中使用。
具体使用如下:
// 直接调用分页主函数pages
// 在使用时至少需要传入4个参数:分页总数量,当前页,每页的数量,分页链接规则
$num = 300; //总数量
$now = intval($_GET['page'])>1 ? intval($_GET['page']) : 1; //当前页
$perpage = 20; //每页数量
$rules = '/tag.html~/tag_{$page}.html'; //分页链接规则,第一页使用第一条规则,第二页及以后使用第二条规则
$nav = pages($num, $now, $perpage, $rules);
echo $nav;【注意】
分页链接规则中{$page}不是变量,在分页路径处理时会需要他进行解析,解析成页码,因此千万不要用双引号包起来。
下面来看看上面的调用会生成什么:

300条数据,每页20条,15页,每页的链接与分页规则 '/tag.html~/tag_{$page}.html' 也完全相符,正是我们想要的分页导航。也就是说分页导航的生成是成功的。
分页导航在分页函数中是存储在 $multipage 变量中的,因此如果需要在分页导航中加什么样式或者属性可以直接在主函数中修改,网上其它人分享的phpcmsv9中分页样式修改也是这样修改的。
【TIPS】
其实在v9中有很多功能都被抽出来放到了全局函数中,可以供我们直接使用,比如请求ip获取、图片加水印、字符串过滤、安全处理、缩略图片生成、字符串数组互转等。

