FMCakeMixのUser Guide.pdfを参考に、CakePHP x FileMakerでWebアプリの作成方法を紹介する。FX.phpに添付されているFileMakerファイルをベースに、Paginationを使った一覧画面の実装方法を。5回目よりCakePHP, FMCakeMixの規約を紹介。前回までに規約にしたがったFileMakerデータベース、database.php、モデルの作成方法を紹介した。今回はコントローラ、ビューの作成までを紹介しよう。

Hello, FMCakeMix! チュートリアル / コントローラ、ビューの記述例

前回の最後にbookモデルとauthorモデルを作成した。今回はこれらのコントローラを作成する。

  • booksコントローラ: /app/controllers/books_controller.php
  • authorsコントローラ: /app/controllers/authors_controller.php

コントローラではアプリケーションのロジックを定義する。コントローラ名はとりあつかうモデルにもとづいたものになり、複数形となる。BookモデルはBooksControllerによってあつかい、AuthorモデルはAuthorsControllerによってあつかわれる。

コントローラにはアクション(actions)とよばれる、ビューを表示するために使用されるメソッドをいくつでも定義することが可能。アクションの名前と役割の例は次のとおり。

  • index: レコードの一覧画面を表示
  • view: レコードの詳細画面を表示
  • add: レコードの登録画面を表示/登録処理
  • edit: レコードの編集画面を表示/編集処理
  • delete: レコードの削除画面を表示/削除処理

CakePHPのデフォルトのルーティングは「http://(ホスト名)/(コントローラ名)/(アクション名)/(パラメータ1)/(パラメータ2)/(パラメータ3)・・・」となっている。/books/viewというURLは、BooksControllerのview()アクションにマップされる。URLでアクション名を指定しなかった場合、index()メソッドがもちいられる。上記の場合

  • http://(ホスト名)/books/で書籍情報の一覧画面を表示
  • http://(ホスト名)/authors/addで著者情報の新規登録画面を表示

といった具合になる。

これらを踏まえて、コントローラを作成してみよう。まずは書籍情報のレコード登録処理をおこなうadd()メソッドからだ。

booksコントローラ記述例 - /app/controllers/books_controller.php

<?php
class BooksController extends AppController
{
    var $name = 'Books';

    function add()
    {

        if (!empty($this->data))
        {
            $this->Book->create();
            if ($this->Book->save($this->data))
            {
                $this->Session->setFlash(__('書籍情報を保存しました', true));
            }
            else
            {
                $this->Session->setFlash(__('書籍情報の保存に失敗しました', true));
            }
        }
    }

}
?>

続いてビューを作成する。

booksビュー記述例 - /app/views/books/add.ctp

<h1>書籍登録</h1>

<?php
    echo $form->create('Book', array('action' => 'add'));
    echo $form->input('title',array('label'=>'書籍名'));
    echo $form->end('書籍情報を登録');
?>

このビューではフォームの自動生成機能([Form Helper](http://book.cakephp.org/view/182/Form))を使用している。$form->input('title');とした場合、<div class="input text"><label for="BookTitle">Title</label><input name="data[Book][title]" type="text" value="" id="BookTitle" />とレンダリングされる。

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

input(string $fieldName, array $options = array())

$fieldNameにはフィールド名を、オプションには次の値を設定する。

  • type: inputタブのtypeを指定したもので強制的に上書きする
  • options: inputのtypeがradioやselectの場合に使用。選択肢を定義する
  • maxLength: 最大文字列長を定義する
  • id: inputタブのidを定義する
  • label: <label>内の文字列を定義する。フィールド名と表示したいラベル名を分けたい場合に使用
  • class: inputタブのclassを定義する

今回使用したフォームヘルパーはほんの一部。ほかの使い方についても随時紹介していこう。

ここまで作成したらWebブラウザで動作を確認する。http://(ホスト名)/books/addにアクセスする。

http://(ホスト名)/books/addにアクセス。登録画面が表示される

Bookモデルのバリデートにて、titleフィールドにnotEmptyを設定している。このため、titleは入力必須となっている

書籍名を入力してボタンをクリックすると、レコードが登録される

実際に登録されたレコード。created, modifiedはCakePHPの機能で自動的に登録される

addにアクセスしただけの場合は、登録画面が表示される。ボタンをクリックすると/books/addに入力されたデータがPOSTされ、レコードが登録される。created, modifiedはHello, FMCakeMix! チュートリアル(6)で紹介したとおり、登録日時と更新日時が自動的に格納される。

なお、FMCakeMix(CakePHP)はapp/tmp/cache/models以下にスキーマ情報をキャッシュする。初回アクセス時などに下記画像のようなエラーが返る場合、なんらかの理由でFileMakerデータベースへの接続に失敗している可能性が高い。FX.phpのデバッグ機能を使用しつつ、database.phpが正しく設定されているかをもう一度確認されたい。

画面を表示する際にエラーが返る場合、FileMakerデータベースへの接続に失敗している可能性が高い。FileMaker Server/FileMaker Server Web公開エンジンが起動しているか、データベース設定が正しいかをチェックしよう