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

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

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

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

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

まずはコントローラのセットアップからだ。

コントローラのセットアップ

Paginationを使用する場合、コントローラでセットアップする内容は次のとおり。

  • limit: 一度に取得するレコード件数を指定
  • order: ソートフィールドと条件を指定。複数指定可 (昇順: asc, 降順: desc)
  • conditions: フィールド名と検索したい文字列を指定

limit

limitには一度に取得するレコード件数を指定する。limitを指定しなかった場合の、一度に取得するレコード件数は20。FX.phpのSetDBData()第3引数、FileMaker API for PHPのsetRange()第2引数に相当する。

  使用メソッド/キーワード 省略時の一度に取得するレコード件数
FMCakeMix Paginate/limit 20件
FX.php SetDBData() 第3引数 50件
FileMaker API for PHP FileMaker_Command_Find::setRange() 第2引数 全件

order

orderにはソートフィールドと条件を指定する。FX.phpのAddSortParam()、FileMaker API for PHPのaddSortRule()に相当する。FMCakeMixではorder配列の順番が、そのままソート優先順として適用されるようだ。

  使用メソッド/キーワード 昇降順の指定法 ソート優先順の指定法
FMCakeMix Paginate/order 配列の値で「asc(昇順)」か「desc(降順)」を指定(値一覧名でのソートは不可?) 配列の順番がそのままソート優先順となる
FX.php AddSortParam() 第2引数にて「ascend(昇順)」か「descend(降順)」または値一覧名を指定 第3引数にて指定
FileMaker API for PHP FileMaker_Command_Find::addSortRule() 第3引数にて「FILEMAKER_SORT_ASCEND(昇順)」か「FILEMAKER_SORT_DESCEND(降順)」または値一覧名を指定 第2引数にて指定

dbo_fmcakemix.phpを見る限り、値一覧名でのソートは対応していない様子。また、実際には「desc」以外の文字列が指定された場合は強制的にasc(昇順)ソートになるようだ。

conditions

conditionsにはフィールド名と検索したい文字列を指定する。FX.phpのAddDBParam()、FileMaker API for PHPのaddFindCriterion()に相当する。FMCakeMixの場合、検索演算子を使用したい場合は「(フィールド名).op」というキーを作成し、値に演算子に対応する識別子("gt"や"neq"など)を指定する必要があるので注意。このあたりはFX.phpやFileMaker API for PHPのほうがスマートにコーディングできるといえよう。

  使用メソッド/キーワード 検索演算子を使用する場合
FMCakeMix Paginate/conditions 「(フィールド名).op」キーを別に作成し、対応する識別子を指定する。">100"というように記号を直接指定しても動作しないので注意
FX.php AddDBParam() 第3引数にて識別子を指定する、または第2引数に記号を直接含めて指定する
FileMaker API for PHP FileMaker_Command_Find::addFindCriterion() 第2引数に記号を直接含めて指定

演算子に対応する識別子については、前回の最後部分を参考にしてほしい。

前回のコントローラにいくつかのオプションをつけて、動作を確認する。なお、ページャ動作確認のためにテーブル内のレコード数をいくつか複製している。

コントローラ記述例 - Paginatorオプションでlimit, orderを指定

<?php

class BooksController extends AppController
{
    function index()
    {   
        $this->layout = false;
        $this->Book->recursive = 0;
        $this->paginate = array
        (   
            'limit' => 5,
            'order' => array
            (   
                'number_of_pages' => 'desc'
            )   
        );  

        $conditions = array
        (   
            'number_of_pages' => '5',
            'number_of_pages.op' => 'gte'
        );  

        $this->set('books', $this->paginate($conditions));
    }
}
?>

この記述例の場合、次の条件でレコードを取得する。

  • 一度に取得するレコード件数は5件
  • ソート対象フィールドはnumber_of_pages。降順
  • number_of_pagesが5以上

実際にWebブラウザで動作を確認してみよう。

一度に取得するレコード件数が5件に、ソートや検索条件が指定されていることがわかる

次回はビューアで使えるPaginationの機能について紹介する。