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してやるしかない

*1:全部を動的に生成する場合は空文字

*2::pageにデフォルト値を設定して省略できるようにしてはいけない