SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

symfony入門

symfony入門(3):掲示板アプリケーション作成でsymfonyを理解しよう(後篇)

symfonyによる実践的なPHPアプリケーション開発


ページャー機能

 すべての投稿を単一のページに表示する事は現実的ではないので、掲示板にページャー機能を実装します。symfonyにおいてページャー機能を実装する際は、sfPropelPagerオブジェクトが役に立ちます。

executeList()編集

 sfPropelPagerオブジェクトをListアクション内で使用します。

actions.class.php(抜粋)
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オブジェクトのメソッドを以下にまとめておきます(ビュー関連で使用するメソッドは後述)。

sfPropelPagerオブジェクトのメソッド
メソッド内容
new sfPropelPager(モデルクラス名, 1ページあたりのレコード数)コンストラクタ。
->setCriteria($c)Criteriaオブジェクト$cに抽出基準を設定。
->setPage(n)nページ目の表示に設定。
->init()ページャーの初期化を行う。
->getResults()リクエストされたページで表示するレコード群を得る。

 上記アクションのsetPageメソッド内でgetRequestParameterメソッドを第2引数付きで使用していますが、これはデフォルト値を表しています。

listSuccess.php編集

 上記のlistアクションから送られて来た$pagerに対応するように、ビューの方も編集します。

listSuccess.php(抜粋)
 :
 :

//ページャー機能を使う必要があるかの判定
<?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 > >>

 ここで使用したメソッド群を、表にまとめておきます。

主にビューで使うsfPropelPagerのメソッド群
メソッド内容
->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ページしかありませんが……)。

ページャー機能を実装
ページャー機能を実装

次のページ
検索機能/カスタムヘルパー

修正履歴

この記事は参考になりましたか?

symfony入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 川北 季(カワキタ ミノル)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/911 2007/03/09 10:08

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー