Laravel5にはページネーションを実装する仕組みがはじめから用意されているらしい(ここを参考)のですが、まずははPHPをゴリゴリ書いて自分で実装してみたいと思います。
方針
- 記事一覧ページで、表示件数分の記事を表示する
- 以下の2つのパラメータを使用する
- page : 現在表示中のページ番号
- show_num : 表示件数
- getで page、show_num パラメータを受け取る
- 例:
http://localhost/my_bbs/public/posts?page=1&show_num=50
- 例:
ソース
php.resources/views/posts/index.blade.php
@extends('layout')
@section('content')
<h1>記事一覧</h1>
<?php
//ページネーションの実装
if (!empty($_GET['page'])) {
$page = $_GET['page'];
}else {
$page = 0; //デフォルト値
}
if (!empty($_GET['show_num'])) {
$show_num = $_GET['show_num'];
}else {
$show_num = 10; //デフォルト値
}
$maxid = count($posts) - 1;
print("posts:{$maxid}<br>"); //総投稿数
//ページ番号のリンクを生成
for ($i = 0; $i <= ceil($maxid / $show_num) - 1; ++$i) {
print("<a href='?page=$i&show_num=$show_num'>");
if ($i != $page){
print("$i");
}else{
//表示中のページ番号を大きく表示
print("<font size='5' color='1253A4'><b>$i</b></font>");
}
print('</a> ');
}
//ページネーション終了
?>
<hr/>
@for ($i = $show_num * $page; $i < $show_num * ($page + 1); ++$i)
<?php
if ($i >= $maxid) break;
$post = $posts[$i];
?>
@include('posts.one_article',['post' => $post])
@endfor
@endsection
結果
bootstrapを使用する
bootstrapのページネーションのデザインを使用するように修正します。
上記の実装との変更点は
- ceil($maxid / $show_num) - 1
を $maxpage とした
- ページ番号のリンクを作成する部分
のみです。
php.resources/views/posts/index.blade.php
~~
$maxid = count($posts) - 1;
$maxpage = ceil($maxid / $show_num) - 1;
print("posts:{$maxid}<br>");
//bootstrapのページネーションの使用準備
print("<div class='bs-example' data-example-id='simple-pagination'>");
print("<nav>");
print("<ul class='pagination'>");
//左端のヤジルシを page = 0 に対応させる
print("<li>");
print("<a href='?page=0&show_num=$show_num' aria-label='Previous'><span aria-hidden='true'>«</span></a>");
print("</li>");
//ページ番号のリンクを生成
for ($i = 0; $i <= $maxpage; ++$i) {
if ($i != $page){
print("<li><a href='?page=$i&show_num=$show_num'>$i");
}else{ //表示中のページ番号を大きく表示
print("<li class='active'><a href='?page=$i&show_num=$show_num'>$i");
}
print('</a>');
print("</li>");
}
//右端のヤジルシを page = maxpage に対応させる
print("<li>");
print("<a href='?page=$maxpage&show_num=$show_num' aria-label='Next'><span aria-hidden='true'>»</span></a>");
print("</li>");
print("</ul>");
print("</nav></div>");
print("<hr/>");
//ページネーション終了
?>
~~
結果(Bootstraps使用版)
表示件数をいじる
表示件数をドロップダウンメニューを使っていじれるようにします。
やったことは
- ページネーションと表示件数部分をブレードテンプレートでまとめて別ファイルにした
- tableタグで表示件数フォームとページネーションを並べた
- tableタグ以外で並べる方法をご存知のかたはアドバイスお願いします!
php.resources/views/posts/index.blade.php
@extends('layout')
@section('content')
<h1>記事一覧</h1>
<?php
if (!empty($_GET['page'])) {
$page = $_GET['page'];
}else {
$page = 0;
}
if (!empty($_GET['show_num'])) {
$show_num = $_GET['show_num'];
}else {
$show_num = 10;
}
$maxid = count($posts) - 1;
?>
// page と show_num を変数として my_pagenation に渡す
@include('posts.my_pagenation', ['page' => $page, 'show_num' => $show_num])
<hr>
~~
php.resources/views/posts/my_pagenation.blade.php
<?php
$maxpage = ceil($maxid / $show_num) - 1;
print("<div align='left'>");
print("<table>");
print("<tr>");
print("<td>");
//表示件数用アクションボタン {{{
print("表示件数: ");
print("<!-- Single button -->");
print("<div class='btn-group'>");
print("<button type='button' class='btn btn-default dropdown-toggle' data-toggle='dropdown'>");
print("$show_num <span class='caret'></span>");
print("</button>");
print("<ul class='dropdown-menu' role='menu'>");
$num_array = [10, 20, 50, 100];
foreach($num_array as $j) {
print("<li><a href='?page=0&show_num=$j'>$j</a></li>");
}
print("</ul>");
print("</div>");
//表示件数用アクションボタン終了 }}}
print("</td>");
print("<td> </td>");
print("<td>");
//ページネーションの実装
~~ 上記のソースと同じ
//ページネーション終了
print("</td>");
print("</tr>");
print("</table>");
print("</div>");
結果
希望する表示件数を選択すると、ページ更新が行われ、ページは0の状態になります。
問題点
- 何件表示するかに関わらず記事を全件取得しているため、処理が重くなる可能性がある
何かプログラムミスや「こうした方がエレガントだよ!」等アドバイスがあれば、コメントにてお知らせくださいm(__)m