FMCakeMixのUser Guide.pdfを参考に、CakePHP x FileMakerでWebアプリの作成方法を紹介する。紹介するのは、CakePHPのPaginationという機能を使った一覧画面だ。前回はファイルのデプロイ、データベースの準備、データベース接続設定、モデルの定義までを紹介した。今回はコントローラ・ビューの作成と実際に動作させてみるまでを紹介する。
コントローラの作成
User Guide.pdf P.5~6 - Controller Examplesより。一覧画面表示用のコントローラを作成する。画面表示にあたりレコードを取得する方法は2種類。
- find
- paginate
今回は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を利用した簡易検索と、ソートの実装例を紹介しよう。
コントローラ記述例
<?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ブラウザで確認する。
ここで気をつけてほしいのは2点。
- あらかじめdbo_fmcakemix.phpを修正しておかないと、フィールド名に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)をもう少し掘り下げ、検索機能や画面遷移について取りあげる。