本文作者:心月

phpcmsv9分頁函數pages的解析,可移植

心月IT博客 12-24
phpcmsv9分頁函數pages的解析,可移植摘要:分頁幾乎在所有的web開發中都會遇到,其實我們可以把分頁分為兩個問題來處理:分頁導航和分頁數據。分頁數據,只需要根據當前頁碼獲取相應的數據即可,不是什么大問題。要說有問題的還是分頁導航。

        分頁幾乎在所有的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獲取、圖片加水印、字符串過濾、安全處理、縮略圖片生成、字符串數組互轉等。

QQ截圖20191224161826.jpg

文章版權及轉載聲明:

本文由 心月IT技術博客 博主整理于 12-24
若轉載請注明原文及出處:http://www.sae4.cn/cms/573.html

分享到:
贊(
發表評論
快捷輸入:

驗證碼

    評論列表 (有 0 條評論,人圍觀)參與討論