LoginSignup
2
2

More than 5 years have passed since last update.

Laravel5入門として画像投稿機能付き掲示板作成を目指す:ページネーション(ゴリゴリ実装編)

Last updated at Posted at 2016-03-04

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

結果

スクリーンショット 2016-03-04 17.18.59.png

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'>&laquo;</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'>&raquo;</span></a>");
    print("</li>");

    print("</ul>");
    print("</nav></div>");
    print("<hr/>");
    //ページネーション終了
?>
~~

結果(Bootstraps使用版)

スクリーンショット 2016-03-04 20.17.29.png

表示件数をいじる

表示件数をドロップダウンメニューを使っていじれるようにします。
やったことは
- ページネーションと表示件数部分をブレードテンプレートでまとめて別ファイルにした
- 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の状態になります。
スクリーンショット 2016-03-05 0.29.43.png

問題点

  • 何件表示するかに関わらず記事を全件取得しているため、処理が重くなる可能性がある

何かプログラムミスや「こうした方がエレガントだよ!」等アドバイスがあれば、コメントにてお知らせくださいm(__)m

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2