ページャー機能
すべての投稿を単一のページに表示する事は現実的ではないので、掲示板にページャー機能を実装します。symfonyにおいてページャー機能を実装する際は、sfPropelPagerオブジェクトが役に立ちます。
executeList()編集
sfPropelPagerオブジェクトをListアクション内で使用します。
public function executeList () { $c = new Criteria(); $c->add(BbsdataPeer::PARENT_ID, 0); $c->addDescendingOrderByColumn(BbsdataPeer::ID); /* $this->parent_bbsdatas = BbsdataPeer::doSelect($c);*/ /* ページャー機能のために、上記から下5行に書き換え */ //ページあたり5つのレコード表示 $pager = new sfPropelPager('Bbsdata', 5); //抽出基準を設定 $pager->setCriteria($c); //ページをビューから受け取った「page」に設定する。 //デフォルトは1ページ目 $pager->setPage($this->getRequestParameter('page', 1)); //ページャーの初期化を行う $pager->init(); //$pagerとしてビューに渡す $this->pager = $pager; /* foreach($this->parent_bbsdatas as $parent)*/ /* ページャー機能のために、上記から下記に書き換え */ //親記事をカウントしてページを振り分けるので、 //返信機能ループに影響はない foreach($this->pager->getResults() as $parent) { $c_reply = new Criteria(); $c_reply->add(BbsdataPeer::PARENT_ID, $parent->getId()); $c_reply->addAscendingOrderByColumn(BbsdataPeer::ID); $no = 'threads'.$parent->getId(); $this->{$no} = BbsdataPeer::doSelect($c_reply); } }
sfPropelPagerオブジェクトは1ページごとのレコード表示数やその時表示するページを設定でき、現在のページと全ページのリストについての情報を有しています。とはいえ、実際には対象レコード総数の問い合わせをまず行い、それから表示するページ分のみのレコード取得を行っているので、ページャー自体の(データが大量になったときなど)パフォーマンスへの影響の心配はないでしょう。上記に出てきたsfPropelPagerオブジェクトのメソッドを以下にまとめておきます(ビュー関連で使用するメソッドは後述)。
| メソッド | 内容 |
| new sfPropelPager(モデルクラス名, 1ページあたりのレコード数) | コンストラクタ。 |
| ->setCriteria($c) | Criteriaオブジェクト$cに抽出基準を設定。 |
| ->setPage(n) | nページ目の表示に設定。 |
| ->init() | ページャーの初期化を行う。 |
| ->getResults() | リクエストされたページで表示するレコード群を得る。 |
上記アクションのsetPageメソッド内でgetRequestParameterメソッドを第2引数付きで使用していますが、これはデフォルト値を表しています。
listSuccess.php編集
上記のlistアクションから送られて来た$pagerに対応するように、ビューの方も編集します。
: : //ページャー機能を使う必要があるかの判定 <?php if ($pager->haveToPaginate()): ?> <?php echo link_to('«', 'bbsdata/list?page='.$pager->getFirstPage()) ?> <?php echo link_to('<', 'bbsdata/list?page='.$pager->getPreviousPage()) ?> <?php foreach ($pager->getLinks() as $page): ?> <?php echo ($page == $pager->getPage()) ? $page : link_to($page, 'bbsdata/list?page='.$page) ?> <?php if ($page != $pager->getCurrentMaxLink()): ?> - <?php endif ?> <?php endforeach ?> <?php echo link_to('>', 'bbsdata/list?page='.$pager->getNextPage()) ?> <?php echo link_to('»', 'bbsdata/list?page='.$pager->getLastPage()) ?> <?php endif ?> <hr> <?php foreach ($pager->getResults() as $bbsdata): ?> : :
上記のスクリプトで、次のようなリンク群が作成されます。そして、->getResults()でリクエストされたページのレコード群を得て、ループ内で表示しています。
<< < 1 - 2 - 3 - 4 - 5 > >>
ここで使用したメソッド群を、表にまとめておきます。
| メソッド | 内容 |
| ->haveToPaginate() | ページャー機能が必要なら真を返す。 |
| ->getFirstPage() | 最初のページを返す(事実上「1」)。 |
| ->getPreviousPage() | 一つ前のページを返す。 |
| ->getLinks(n) | 現ページを中心としたn個の配列を得る(nのデフォルトは5。現在7ページを表示していれば{5,6,7,8,9}が得られる。1ページ目を表示していれば{1,2,3,4,5}と融通も利く)。 |
| ->getPage() | 現在のページを返す。 |
| ->getCurrentMaxLink() | getLinks()で得られた配列の最終ページを返す。 |
| ->getNextPage() | 一つ後のページを返す。 |
| ->getLastPage() | 最終ページを返す。 |
| ->getNbResults() | 全ページを通じた総レコード数を返す。 |
実際には次のような感じになります(2ページしかありませんが……)。

