altere5's blog

I thought what I'd do was, I'd pretend I was one of those deaf-mutes. ( or shou'd i ? )

CakePHPのお勉強 9回目 お問い合わせ一覧のページ処理(1)

お問い合わせ一覧を表示すると問い合わせ件数が増えると大変なことになる。
今のままだと全てを表示しているので30件とか問い合わせが入ると30行表示される。

そこで今回はページ処理(Pagination)を使い大量表示時もきれいに表示されるようにする。

(1) Controllerの修正

最初にコントローラー側の修正を行う。
具体的には「ContactsController.php」を以下のように修正する。

    // listアクション
    public function contactlist() {

        $this->paginate = array(
            'Contact' => array('limit' => 10, 'order' => 'Contact.created desc'),
        );

        $this->set('contacts', $this->paginate('Contact'));

    }

47行目から49行目でPaginationプロパティに取得条件を設定。
今回は登録日(created)の新しいものから10件単位で取得するよう設定。

51行目で設定内容に従って「Contact」モデルからデータを取得し、それを「contacts」変数に設定。

これでこれまで利用してViewには最新の10件が表示されるはず。

実際の動作。

f:id:altere5:20131128001213p:plain

ちゃんと最新の10件が取得されている。

(2) 各ページへのリンクの表示

最新の10件は表示できたがそれ以外のデータがこのままでは表示できない。
そこでPaginatorHelperを使い必要なコントロールを表示する。

まずは各ページへのリンクを出力する。

今回はビュー側への追加なので「contactlist.ctp」を編集する。

<table>
    <tr>
        <th>お名前</th>
        <th>メールアドレス</th>
        <th>お問い合わせ日時</th>
    </tr>

    <?php foreach ($contacts as $contact): ?>
    <tr>
        <td><a href="/contacts/detail/?id=<?php echo $contact['Contact']['id']; ?>"><?php echo $contact['Contact']['username']; ?></a></td>
        <td><?php echo $contact['Contact']['email']; ?></td>
        <td><?php echo $contact['Contact']['created']; ?></td>
    </tr>
    <?php endforeach; ?>

</table>

<?php echo $this->Paginator->numbers(); ?>
 

18行目でnumberメソッドを使いページへのリンクを取得し出力。
実際に動作。

f:id:altere5:20131128002521p:plain

で、2ページ目を押すと。

f:id:altere5:20131128002535p:plain

ちゃんとページが切り替わる。

(3) 最初、最後のページへのリンクを表示

ページ番号でジャンプもできるけど、最初や最後のようなリンクも表示したい。
その場合も簡単に実装できる。

<table>
    <tr>
        <th>お名前</th>
        <th>メールアドレス</th>
        <th>お問い合わせ日時</th>
    </tr>

    <?php foreach ($contacts as $contact): ?>
    <tr>
        <td><a href="/contacts/detail/?id=<?php echo $contact['Contact']['id']; ?>"><?php echo $contact['Contact']['username']; ?></a></td>
        <td><?php echo $contact['Contact']['email']; ?></td>
        <td><?php echo $contact['Contact']['created']; ?></td>
    </tr>
    <?php endforeach; ?>

</table>

<?php echo $this->Paginator->first($first = '最初', $options = array()); ?>

<?php echo $this->Paginator->numbers(); ?>

<?php echo $this->Paginator->last($last = '最後', $options = array()); ?>
 

18行目で最初のページへのリンク表示の設定とその出力。
22行目で最後のページへのリンク表示の設定とその出力。

実際の動作。

f:id:altere5:20131128003312p:plain

ちゃんと「最初」と「最後」のリンクが表示され動作する。

Paginatorはまだまだ確認する事があるので次回も引き続きPaginatorを勉強する。