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

Laravel5にはページネーションを実装する仕組みがはじめから用意されているらしい([ここを参考](http://w.builwing.info/2012/11/06/laravel%E3%81%A7%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/))のですが、まずははPHPをゴリゴリ書いて自分で実装してみたいと思います。

#方針
- 記事一覧ページで、表示件数分の記事を表示する
- 以下の２つのパラメータを使用する
    - 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](https://qiita-image-store.s3.amazonaws.com/0/111756/97e307a9-d47f-2084-7c44-3c08aa6a1df1.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](https://qiita-image-store.s3.amazonaws.com/0/111756/4de7f51b-aaf3-0b91-967a-eabeab638780.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](https://qiita-image-store.s3.amazonaws.com/0/111756/fa460103-979d-ae1d-6bb6-668ff6095042.png)


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

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