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

コントローラの作成

User Guide.pdf P.5~6 - Controller Examplesより。一覧画面表示用のコントローラを作成する。画面表示にあたりレコードを取得する方法は2種類。

今回はPaginationを使って簡単に一覧画面を作成する。P.4最下部の「paginate」サンプルコードを参考にコントローラを作成。

Paginateの使い方は次のとおり。

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

これらはとくに指定しなくても動作する。いったんまず何もオプションを指定しない状態でコントローラを作成した。

コントローラ記述例

<?php
class BooksController extends AppController
{
    function index()
    {   
        $this->layout = false;
        $this->Book->recursive = 0;
        $this->set('books', $this->paginate());
    }
}
?>

ビューの作成

User Guide.pdf P.8~9 - View Examplesより。さきほど作成したコントローラに対応するビューを作成する。User Guide.pdfにはautomagic fieldsとpaginateと2種類のサンプルコードが記載されている。今回参考にするのはP.6後半部のpaginateの方。FX.phpやFileMaker API for PHPで一覧画面を実装したときと同様、foreachで1レコード1レコードを表示していく。

ビュー記述例

<table cellpadding="0" cellspacing="0">
    <tr>
        <th>
            Title
        </th>
        <th>
            Author
        </th>
        <th>
            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>

これでモデル・コントローラ・ビューの作成がひととおり完了した。Webブラウザで(CakePHPルートディレクトリ)/books/indexにアクセスしてみよう。

Paginationを使った一覧画面が表示された

一覧画面が実際に動作するまでを確認できた。ここまではもっともシンプルな構成の例。続けてPaginationを利用した簡易検索と、ソートの実装例を紹介しよう。

コントローラ記述例

<?php

class BooksController extends AppController
{
    function index()
    {   
        $this->layout = false;
        $this->Book->recursive = 0;

        $conditions = array
        (   
            'title' => 'PHP',
        );  

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

コントローラ側でPagiationを呼び出す際に$conditions配列で検索条件を指定。このサンプルの場合、検索条件「titleに"PHP"をふくむ」にマッチしたレコードが表示されるようになる。

ビュー記述例

<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>

テーブルのヘッダにそれぞれ$paginator->sort()を使ってソート用のリンクを配置している。sort()にはオプションが用意されており、FileMakerフィールド名と表示したいラベル名を別に持たせたり、特定のclassを持たせるといったことが可能だ。

コントローラ・ビュー修正後、Webブラウザで確認する。

検索条件「titleに"PHP"をふくむ」に該当するレコードのみが表示されている

テーブルのヘッダをクリックするとソートがおこなわれる。デフォルトで昇順/降順ソートに対応している

ここで気をつけてほしいのは2点。

  1. あらかじめdbo_fmcakemix.phpを修正しておかないと、フィールド名に2バイト文字が含まれている場合にソートがうまく動作しない
  2. Paginationを使った検索では、「>」「<」といった演算子を使用した検索はできない

1のソートの問題については「番外編: CakePHPでFileMakerを使う方法」の最後を参考にして修正すればOKだ。2の検索条件に記号が使えないのは、dbo_fmcakemix.php側で「すべての検索条件でopが使われるように」コーディングされているため。そのため、$conditionsに「>100」や「<100」と指定してもうまく動作しない。これを防ぎたい場合は$conditions側で、FX.phpのAddDBParam()第3引数に指定してやるように、演算子に対応する文字列を別に指定する必要がある。

コントローラ修正後

<?php
class BooksController extends AppController
{
    function index()
    {
        $this->layout = false;
        $this->Book->recursive = 0;

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

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

number_of_pagesに5を、number_of_pages.opにgteを指定している。この2つで「number_of_pagesが5以上」という意味になる。実際にWebブラウザで動作を確認する。

コントローラの$conditionsを変更し、「number_of_pagesが5以上」の検索条件に。'number_of_pages' => '>=5'としただけではうまく動作しない

'number_of_pages' => '5'および'number_of_pages.op' => 'gte'としてやることで、うまく機能する

opに使用できる引数をおさらいしておこう。

キーワード 動作 FileMaker Proの演算子
eq 単語全体が一致 (または空白に一致) / デフォルトで使用される =値
cn 単語を含む 値*
bw 前方一致 値*
ew 後方一致
gt 大きい >値
gte 大きいか等しい >=値
lt 小さい
lte 小さいか等しい <=値
neq 単語を含まない 除外,値

次回はPagination(PaginatorHelper Class)をもう少し掘り下げ、検索機能や画面遷移について取りあげる。