FuelPHPでページネーション(実践編その6)

祝!『FuelPHP入門』の出版

初めてのFuelPHPの日本語解説書『FuelPHP入門』が、6月2日に出版されました。これで、FuelPHPドキュメントだけでは、いまいち理解できなかった部分をより深く知ることが出来ます。早速購入して、読みあさっています。これでFuelPHPによるアプリケーションの開発がスピードアップするものと確信しています。

それでは、今日は、FuelPHPでページネーションをする方法を調べてみたいと思います。CakePHPでのページネーションは、驚くほど簡単でしたが、FuelPHPではどうでしょうか。

1. FuelPHPのページネーションは、残念ながらCakePHP程簡単ではありません。FuelPHPでページネーションを行うには、いくつかの前処理をしなければなりません。indexアクションを下記のように修正します。

app/classes/controller/collection.php

public function action_index(){
 //ビューに渡す配列の初期化
 $data=array();
 //データ件数の取得
 $count=Model_Collection::count();
 //Paginationの環境設定
 $config=array(
 'pagination_url'=>'collection/index',
 'uri_segment'=>3,
 'num_links'=>4,
 'per_page'=>5,
 'total_items'=>$count,
 'template'=>array(
 'wrapper_start'=>'<div class="pagination"><ul>',
 'wrapper_end'=>'</ul></div>',
 'previous_start'=>'<li class="previous">',
 'previous_end'=>'<li>',
 'previous_inactive_start'=>'<li class="active"><a href="#">',
 'previous_inactive_end'=>'</a></li>',
 'next_inactive_start'=>'<span class="active"><a href="#">',
 'next_inactive_end'=>'</a></span>',
 'next_start'=>'<li class="next">',
 'next_end'=>'</li></ul>',
 'active_start'=>'<span class="active"><a href="#">',
 'active_end'=>'</a></span>',
 ));
 //Paginationのセット
 Pagination::set_config($config);
 //モデルCollectionからページネーションデータを取得
 $data['collections']=Model_Collection::find()
 ->order_by('created','desc')
 ->limit(Pagination::$per_page)
 ->offset(Pagination::$offset)
 ->get();
 //テンプレートファイルにデータの引き渡し
 $this->template->title="WinRoad徒然草";
 $this->template->content = View::forge('collection/index', $data);
 }

2. 次に、ページネーション用のリンクを作成するためにビューファイルも修正します。修正といっても、たった1行を追加するだけです。

app/views/collection/index.php

<h3><?php echo Session::get_flash('success','コレクション一覧');?></h3>
 <?php echo Pagination::create_links();?>
 <table width="100%" border="1">
 <tr>
 <th scope="col">ID</th>
 <th scope="col">タイトル</th>
 <th scope="col" class="sp_none">作成日</th>
 <th scope="col" class="sp_none">コード</th>
 <th scope="col">保管場所</th>
 </tr>
 <?php foreach($collections as $row): ?>
 <tr>
 <td><?=$row->id?></td>
 <td><?php echo Html::anchor('collection/detail/'.$row->id,
 $row->title,array(
 'class'=>'btn btn-success','id'=>'a_btn',
 ))?></a></td>
 <td class="sp_none"><?=$row->created?></td>
 <td class="sp_none"><?=$row->col_code?></td>
 <td><?=$row->save_space?></td>
 </tr>
 <?php endforeach;?>
 </table>

3. それでは、ブラウザで確認してみます。ページネーションが表示されています。

4. ページ番号をクリックしてみます。URIのセグメントの3番目が『5』になって、ページネーションの5ページ目を表示しています。

本日のコード解説

  • $count=Model_Collection::count();
    ページネーションをするには、まず全データのデータ件数を取得する必要があります。countメソッドで、まず最初に全データ件数を取得します。
  • ‘pagination_url’=>’リンク先のURL’
    ページネーションクラスの設定に必要なリンク先のURLを指定します。indexページをページネーションで表示しますので、’collection/index’を指定しています。
  • uri_segment’=>URIセグメント番号
    ページ番号を指定するURLセグメント番号を指定します。 第1セグメントがコントローラ名、第2セグメントがアクション名ですので、第3セグメントを指定します。
  • ‘num_links’=>表示リンク数
    現在のページの前後何ページ分を表示するかを指定します。前半は、アクティブページを加えたページ数、後半は、指定したページ数を表示します。最高で、指定リンク数の倍のページを表示することになります。
  • per_page’=>1ページあたりのデータ件数
    1ページにデータを何件表示するかを指定します。
  • ‘total_items’=>全データ件数
    表示する全データ件数を指定します。 ここでは、countメソッドで取得したデータ件数を指定しています。
  • ‘template’=>array()
    ページネーションエレメントを作成する為のHTMLマークアップを指定します。基本となるテンプレートファイル 『collection_template』が、twitterBootstrap2.0で作成していますので、今回は、TwitterBootstrap2.0のPaginationで表示されるように工夫して作成しました。『Previous』と『Next』を日本語表記にすることは出来るのですが、ブラウザによっては日本語と数字の枠の大きさが違って、みっともなかったので、今回は、日本語表記にはしていません。日本語表記にするには、app/lang/ja/フォルダにpagination.phpを作成し、下記のように記述します。

    <?php
    return array(
    'previous' => '前頁へ',
    'next' =>'次頁へ',
    );

  • Pagination::set_config($config)
    ページネーションにconfig情報をセットします。
  • limit(Pagination::$per_page)
    ページネーションに1ページあたりの表示データ件数を指定します。
  • offset(Pagination::$offset)
    1ページあたりの表示データ件数と、URIで指定されたページ番号から自動的に算出されたオフセット値が$offsetで指定されます。
  • Pagination::create_links()
    set_config($config)で指定された値に基づきページネーション用のリンクを作成します。

CakePHPには、データを簡単に並べ替えられるメソッドとかあって使いやすかったのですが、FuelPHPでは、この辺のメソッドは自分で作成する必要がありそうです。本日は以上です。

FuelPHP ver1.3のレイアウトについて

FuelPHPのv1.3からは、Twitter Bootstrap2.0が標準で装備されています。ページネーションのレイアウトもTwitter Bootstrapに最適化されていますので、template=array()内の、HTMLマークアップは無くても大丈夫みたいです。

以上追加情報でした。(2012/10/03)

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ