Doctrine_Pager_Layoutの使い方
Doctrineに付属しているPagerクラス。
Pagerだけでは、ページングのナンバーリンクの自動生成はできない。
そこで、包括的なDoctrine_Pager_Layoutを利用するようにするとPagerもRangeも同時に利用することが可能。
しかし、Pager_Layoutの生成はちょっと煩雑。
<?php $pager = new Doctrine_Pager( $query, $currentPage, $perPage); $layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), $urlMask );
こんな感じなので、Actionに書くより、モデル内なりに入れてしまったほうがいい。
よく使うメソッド
メソッド名 | 返り値 | 説明 |
---|---|---|
Pager#execute() | Doctrine_Collection | 現在のページで表示する分のデータを取得する |
Pager_Layout#display() | null | ナンバーリンクを出力する |
Pager#haveToPaginate() | boolean | ページネイトする必要があるか(1ページしかないかどうか) |
Pager#getPreviousPage() | integer | 前のページNo |
Pager#getNextPage() | integer | 次のページNo |
Pager#getLastPage() | integer | 最後のページNo(ページ数) |
ベースURLがうまくいかない
urlMaskを設定する。
インスタンス後はaddUrlMask()による追加しかできないので、なるべくインタンスで決める。
どうしてもの時は、インタンス時に固定部分のみ宣言する*1
また、サンプル通りに{%page_number}を指定すると、/foo/barなURLの場合/foo/page_numberとなってしまう。
単純に相対パスで計算されてしまうから起こるものなので、/foo/bar/:page*2のようにして回避するか、generateUrl()などを使って、urlMaskに強引に設定する。
<?php $url = $this->generateUrl('route_name'); $layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), "{$url}/{%page_number}" );
リンクURLに動的なパラメータが必要
先程のurlMaskに強引に設定する方法でもいける。
他の方法としてdisplay()にパラメータを渡すことで実現できる。
パラメータが適用できる範囲は、urlMaskとsetTemplate()で指定する書式内
urlMaskはsetTemplate()内では{%url}として扱われる。
$layout = new Doctrine_Pager_Layout( $pager, $pager->getRange('Sliding', $options), "{%foo}" ); $layout->setTemplate('<a href="{%url}/{%bar}/{%page_number}">{%page_number}</a>'); $layout->display(array('foo' => 'hoge', 'bar' => 'fuga')); #=> <a href="hoge/bar/1">1</a><a href="hoge/bar/2">2</a>...
ナンバーリンク1つ毎に違うパラメータが必要
Rangeを使って、foreachしてやるしかない