PHPでページネーションの作成(makePagination)

提供:wiki - PCスキルの小技・忘却防止メモ
移動: 案内, 検索

PHPでページネーションの作成(makePagination)。ページ数や次・前のページなどの情報を取得したい

目次

基本

ページネーションを作る際、欲しい情報ってのは下記。

  • 総件数
  • 現在のページ数
  • 前と次のリンク先
  • ○~○ページの値

「現在のページ数」はDBにクエリを投げる際にすでに知っている値だし、「総件数」はDBにクエリを投げれば分かること。残りの項目を取得する関数。

ソース

/**
 * ページネーションの作成
 * 
 * $viewNum  : 1ページの表示する件数
 * $totalNum : 総件数
 * $curreNum : 現在のページ番号
 */
function makePagination($viewNum, $totalNum=0, $curreNum) {
	$item = 5; // ページネーションの個数:奇数だと都合がいい。
	
	$results = array();
	$results["now"]   = $curreNum; // 現在のページ番号
	$results["count"] = $totalNum; // 総件数
	$results["max"]   = 0;         // 総ページ数
	$results["next"]  = 0;         // 次:-1でページなし
	$results["pref"]  = 0;         // 前:-1でページなし
	$results["start"] = 0;         // ページネーションの最初
	$results["end"]   = 0;         // ページネーションの最後:forで回すこと考えて1つ多めにしている
	
	if ($viewNum < $totalNum) {
		$results["max"] = (int) ceil($totalNum / $viewNum);
		
		if ( $results["max"] <= $curreNum ) {
			$results["next"] = null;
		}
		else {
			$results["next"] = $results["now"] + 1;
		}
		
		if ($results["now"] <= 1 ) {
			$results["pref"] = null;
		}
		else {
			$results["pref"] = $curreNum - 1;
		}
		
		$results["start"] = $curreNum - (int) ceil( $item / 2 ) + 1;
		if ($results["start"] <= 1) {
			$results["start"] = 1;
		}
		
		$results["end"] = $results["start"] + $item;
		if ( $results["max"] <= $results["end"]) {
			$results["end"] = $results["max"] + 1;
			$results["start"] = $results["end"] - $item;
			if ( $results["start"] <= 0 ) {
				$results["start"] = 1;
			}
		}
	}
	return $results;
}

あとはHTMLの出力のトコで、「$results["start"]~$results["end"]」をループさせればOK。

そのループの中でif文の条件で「$results["now"] 」を使えば文字の装飾も可能。

HTML生成のサンプル

/**
 * $limit: 1ページの表示する件数
 * $total: 総件数
 * $nowPage : 現在のページ番号
 */
function getHtmlPagination ($limit, $total, $nowPage) {
	$pagination = makePagination($limit, $total, $nowPage);
	
	if(1 < (int) $pagination['now']) {
		$fst = '<a href="「リンク先」">&laquo; 最初</a>' . "\n"
		     . '<a href="「リンク先」">&lt; 前</a>' . "\n";
	}
	else {
		$fst = '<span>&laquo; 最初</span>' . "\n"
		     . '<span>&lt; 前</span>' . "\n";
	}
	
	if((int) $pagination['now'] < $pagination['max']) {
		$lst = '<a href="「リンク先」">次 &gt;</a>' . "\n"
		     . '<a href="「リンク先」">最後 &raquo;</a>' . "\n";
	}
	else {
		$lst = '<span>次 &gt;</span>' . "\n"
		     . '<span>最後 &raquo;</span>' . "\n";
	}
	
	$mid = "";
	for ($i=$pagination['start']; $i<$pagination['end']; $i++) {
		$class = ($i == $pagination['now'])? ' class="now"': ;
		$mid .= '<a href="「リンク先」" ' . $class . '>' . $i . '</a>' . "\n";
	}
	
	$html = '<div>' . "\n"
	      . $fst
	      . $mid
	      . $lst
	      . '</div>' . "\n";
	
	return $html;
}

関連項目