FMCakeMixのUser Guide.pdfを参考に、CakePHP x FileMakerでWebアプリの作成方法を紹介する。紹介するのは、CakePHPのPaginationという機能を使った一覧画面だ。1回目はファイルのデプロイ、データベースの準備、データベース接続設定、モデルの定義を。2回目はコントローラ・ビューの作成と実際に動作させてみるまで、3回目はコントローラでセットアップするPaginationの使い方を紹介した。今回はビューで使えるPaginationの機能について紹介する。

Hello, FMCakeMix! チュートリアル / Paginationとは

Paginationは一覧画面などでページャ機能を簡単に提供するためのヘルパー。一覧画面を実装する場合、ソートやページ前後の遷移など、考慮しなければならない点がおおくある。CakePHPにはPaginationとよばれるヘルパーが用意されており、デベロッパは簡単なセットアップをおこなうだけで簡単に一覧画面を実装できるようになる。

Paginationを使うための準備作業はおもに次のとおり。

  • コントローラのセットアップ
  • ビューにおけるページ付け

前回はコントローラのセットアップまでを紹介した。今回はビューにおけるページ付け - ビューで使えるPaginationの機能について紹介しよう。

ビューにおけるページ付け

PaginatorHelperの機能は次のとおり(一部を抜粋)。

  • options: PaginatorHelperが作成するリンクや表示方法をカスタマイズする
  • counter: 現在ページ, 最大ページ数, レコード総数, 対象レコード数, レコードの何件目から何件目といった情報を表示する。表示のフォーマットはカスタマイズ可能
  • first: 最初のページへのリンクを作成する
  • prev: 前のページへのリンクを作成する。FX.phpの$ReturnedData['linkPrevious']に近い
  • numbers: ページ番号を作成する
  • next: 次のページへのリンクを作成する。FX.phpの$ReturnedData['linkNext']に近い
  • last: 最後のページへのリンクを作成する
  • sort: ソートをおこなうためのリンクを作成する

option

optionではPaginatorHelperが作成するリンクや表示方法をカスタマイズする。

  • format: counterが出力するフォーマットをカスタマイズする。特定の定数は対応する値に置換される(別表を参照)
  • separator: ページ区切りのセパレータをカスタマイズする。デフォルトは " of "
  • url: PaginatorHelperが作成するリンクをカスタマイズする
constants 置換後の値
%page% 現在のページ
%pages% 最大ページ数
%count% レコード総数
%current% 対象レコード数
%start% 表示開始レコード数
%end% 表示終了レコード数

counter

counterではページの結果セット中、現在表示しているページ数やレコード総数といった情報を表示する。表示のフォーマットはoptionでカスタマイズする。

counter使用例

<p>
<?php
echo $paginator->counter();
?>
</p>

<p>
<?php
echo $paginator->counter
(
    array
    (   
        'format' => __('Page %page% of %pages%, showing %current% records out of %count% total, starting on record %start%, ending on %end%', true) 
    )   
);
?>
</p>

<p>
<?php
echo $paginator->counter
(
    array
    (   
        'format' => __('%page% / %pages% ページ, %count% 件中, %start% - %end% 件目を表示', true) 
    )   
);
?>
</p>

counterのformatは先述のoptionのほか、counter内で直接指定も可能。次のように表示される。

counterのフォーマットカスタマイズ例

first, prev, next, last

それぞれ最初のページ, 前のページ, 次のページ, 最後のページへのリンクを作成する。firstとlastには$title, $options、prevとnextにはこれに加えて$disabledTitle, $disabledOptionsと4つのパラメータが指定でき、リンクが有効/無効の場合の表示形式をカスタマイズできる。

first, prev, next, last使用例

<p>
<?php
echo $paginator->first();
echo $paginator->prev();
echo $paginator->next();
echo $paginator->last();
?>
</p>

<p>
<?php
echo $paginator->first('最初のページ', null);
echo $paginator->prev('前のページ', null, '前のページ', array('tag'=>'span'));
echo $paginator->next('次のページ', null, '次のページ', array('tag'=>'span'));
echo $paginator->last('最後のページ', null);
?>
</p>

prev, nextの第3/4引数は、ページが存在しないときに表示する文字列とオプション。次のように表示される。

first, prev, next, lastのカスタマイズ例

numbers

numbersでは複数ページにまたがる場合の、ページ番号を作成する。セパレータや一度に表示するページ番号の数、ラップするタグなどはオプションでカスタマイズ可能。

numbers使用例

<p>
<?php
echo $paginator->numbers();
?>
</p>

このサンプルでは次のように表示される。

numbersの使用例

ページが移動すると動的に開始・終了ページも変わる

sort

sortではソート用リンクを作成する。表示例については「Hello, FMCakeMix! チュートリアル(2)」を参照されたい。

Hello, FMCakeMix! チュートリアル(2)」のビュー記述例をベースに、これらのメソッドを使用して一覧画面を再実装する。

ビュー記述例

<p style="text-align: center">
<?php
    echo $paginator->counter
    (
        array
        (
            'format' => __('%page% / %pages% ページ,  <span class="foundCount">%count%</span>件中、%start% - %end% 件目を表示', true)
        )
    );
    echo '<br>';
    echo $paginator->prev('<< '.__('前のページ', true), array(), null, array('class'=>'disabled', 'tag' => 'span'));
    echo ' | ' . $paginator->numbers() . ' | ';
    echo $paginator->next(__('次のページ', true).' >>', array(), null, array('tag' => 'span', 'class' => 'disabled'));
?>
</p>

<table cellpadding="0" cellspacing="0">
    <tr>
        <th>
            <?php echo $paginator->sort('Title' , 'title');?>
        </th>
        <th>
            <?php echo $paginator->sort('Author', 'author');?>
        </th>
        <th>
            <?php echo $paginator->sort('Pages', 'number_of_pages');?>
        </th>
    </tr>
    <?php
    $i = 0;
    foreach ($books as $book)
    {
        ?>
        <tr>
            <td>
                <?php echo $book['Book']['title']; ?>
            </td>
            <td>
                <?php echo $book['Book']['author']; ?>
            </td>
            <td>
                <?php echo $book['Book']['number_of_pages']; ?>
            </td>
        </tr> 
        <?php
    }
    ?>
</table>

<p style="text-align: center">
<?php
    echo $paginator->prev('<< '.__('前のページ', true), array(), null, array('class'=>'disabled', 'tag' => 'span'));
    echo ' | ' . $paginator->numbers() . ' | ';
    echo $paginator->next(__('次のページ', true).' >>', array(), null, array('tag' => 'span', 'class' => 'disabled'));
    echo '<br>';
    echo $paginator->counter
    (
        array
        (
            'format' => __('%page% / %pages% ページ,  <span class="foundCount">%count%</span>件中、%start% - %end% 件目を表示', true)
        )
    );
?>
</p>

counter, prev, numbers, nextを使用してナビゲーションを追加した。これをWebブラウザで表示する。

PaginatorHelperの機能を使用し、ナビゲーションを上下に配置した

ページ送り処理の実装はなかなか手間がかかるが、Paginatorを使いこなせば効率よく実装ができるようになる。マニュアルを熟読して、しっかり使いこなせるようになっておこう。