速習Larave3(その8)、ペジネーション

タグ: Laravel3  

続いてペジネーションを見てみましょう。

ペギネーションとも言いますね。でもパジネーションと書くのが発音からすると本当は正しんでしょう。皆さんの耳にはどう聞こえますか。

さて、いよいよあのごちゃごちゃしたペジネーションのコーディングを初めましょう。トップページのルートルートで呼び出される記事一覧ページをペジネーションにしましょう。なにせ、記事を作りまくりやすいシステムですから、皆さん十分にテストして数百位は記事ができていることでしょう。

では、コントローラーのpost.phpにある、get_indexメソッドを変更しましょう。

    /**
     * 一覧表示
     */
    public function get_index()
    {
        $posts = Post::order_by('created_at', 'desc')->paginate(10);
        return view('post.index')
                ->with('posts', $posts->results)
                ->with('link', $posts->links());
    }

なんてことでしょう。ごちゃごちゃになりません。ごちゃごちゃを期待していたネガティブ思考の方、すいません。

get()の代わりにpaginate()という、全くそのままのメソッドに変わっただけです。

ああ、それとその結果のresultlink()をビューに渡していますね。

とても簡単です。

ビューも見ましょう。index.blade.phpを変更してください。

@layout('template')

@section('title')
一覧表示
@endsection

@section('content')
<style>
    .pagination li {
        display: inline;
        margin: 0 5px;
    }
</style>
<table>
    <tr>
        <th>タイトル</th>
        <th>作成日</th>
        <th>更新</th>
        <th>削除</th>
    </tr>
    @foreach($posts as $post)
    <tr>
        <td>{{ HTML::link_to_route('post-show', $post->title ,array($post->id)) }}</td>
        <td>{{ $post->created_at }}</td>
        <td>{{ HTML::link_to_route('post-edit', '✜', array($post->id)) }}</td>
        <td>{{ HTML::link_to_route('post-delete', '✖', array($post->id)) }}</td>
    </tr>
    @endforeach
</table>
{{ $link }}
@endsection

見たところ、最初の方にスタイル、最後にリンクが追加されています。

すいません。CSSには関わらないつもりだったんですが、ペジネーションに関わるとそうも言ってられないんです。LaravelのCSSはユーザーに自由に使用してもらうために、完全なCSSは用意してないんです。そこで、最低限だけ指定しました。

リンクにはページの表示状況に合わせて生成されたページリンクのコードが入っています。これはユーザー入力でありませんから、e()で囲まないでくださいね。HTMLがそのまま出力される事態になります。

ご覧の通り、Laravelのペジネーションはシンプルです。その代わり、自由自在というわけには行きません。HTTP変数のGET限定です。特に指定しなくてもURIにクエリー文字列としてページコントロールの情報は自動的に付け加えられます。個人的にはフォームにペジネーションをつけるのは面倒なので、POSTメソッドをカバーしていないのは欠点に思えないのですが、どうしてもやりたい方はいらっしゃるでしょうね。

もうひとつ、生成されるリンクのHTMLを変更できないのです。ulliで構成され、クラス名も固定です。CSSで変更することを前提にしています。なにせ、TwitterBootstrapが流行る前に出来たクラスですからね。ちなみにLaravel4ではBootstrapがデフォルトになるそうです。それより、生成の自由度が上がるほうが嬉しいのです。私はCSSフレームワークはBootstrapより、Foundationのほうがお気に入りですから。 :D