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

Hello, FMCakeMix! チュートリアル / 一覧・詳細表示におけるコントローラ、ビューの記述例

Booksテーブルの登録処理をFMCakeMixで実装した。今回は登録したレコードを一覧で確認するための画面、および詳細画面を実装してみよう。今回作成するアクションは次の2つ。

  • index: レコードの一覧画面を表示
  • view: レコードの詳細画面を表示

まずは一覧画面から実装してみよう。基本的な作成方法は「Hello, FMCakeMix! チュートリアル(3), (4)」と変わらない。

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

function index()
{
    $this->paginate = array
    (
        'limit' => 5
    );

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

booksビュー記述例 - /app/view/books/index.ctp

<h1>書籍一覧</h1>

<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('Id' , 'id');?>
        </th>
        <th>
            <?php echo $paginator->sort('Title' , 'title');?>
        </th>
        <th>
            <?php echo $paginator->sort('Author', 'author');?>
        </th>
        <th>
            <?php echo $paginator->sort('Created', 'created');?>
        </th>
        <th>
            <?php echo $paginator->sort('Modified', 'modified');?>
        </th>
    </tr>
    <?php
    $i = 0;
    foreach ($books as $book)
    {
        ?>
        <tr>
            <td>
                <?php
                echo $html->link
                (
                    h($book['Book']['id']),
                    array
                    (
                        'controller' => 'books',
                        'action' => 'view',
                        'id' => $book['Book']['id']
                    )
                ); ?>
            </td>
            <td>
                <?php echo h($book['Book']['title']); ?>
            </td>
            <td>
                &nbsp;
            </td>
            <td>
                <?php echo h(date('Y/m/d H:i:s', $book['Book']['created'])); ?>
            </td>
            <td>
                <?php echo h(date('Y/m/d H:i:s', $book['Book']['modified'])); ?>
            </td>
        </tr> 
        <?php
    }
    ?>
</table>

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

<p>
<?php
    echo $html->link
    (
        '書籍情報を登録する',
        array
        (
            'controller' => 'books',
            'action' => 'add'
        )
    );
?>
</p>

前回と同様、Paginatorをもちいた実装だ。

  • Authorに関してはまだ作成していないのでセルのみを作成
  • CreatedとModifiedにはレコード登録・編集時にCakePHPによってUNIXタイムスタンプが格納されるので、これをdate('Y/m/d H:i:s')でFileMakerのタイムスタンプ形式のように表示
  • ページ下部に前回作成した登録画面へのリンクを配置
  • h()を使い、特殊文字をHTMLエンティティに変換

Created/Modifiedフィールドはただのテキストフィールドなので、FMCakeMixからレコードを操作したときにしか日時が更新されない。FMCakeMix/FileMaker両側からの操作日時を記録したい場合は、タイムスタンプ形式のフィールドで「入力値の自動化」機能を使おう。

続けて詳細画面の実装だ。

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

function view($id = null)
{
    $this->Book->id = $id;
    $this->set('book', $this->Book->read());
}

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

<h1>書籍詳細</h1>

<table cellpadding="0" cellspacing="0">
    <tr>
        <th>
            Id
        </th>
        <td>
            <?php echo h($book['Book']['id']); ?>
        </td>
    </tr>
    <tr>
        <th>
            Title
        </th>
        <td>
            <?php echo h($book['Book']['title']); ?>
        </td>
    </tr>
    <tr>
        <th>
            Author
        </th>
        <td>
            &nbsp;
        </td>
    </tr>
    <tr>
        <th>
            Created
        </th>
        <td>
            <?php echo h(date('Y/m/d H:i:s', $book['Book']['created'])); ?>
        </td>
    </tr>
    <tr>
        <th>
            Modified
        </th>
        <td>
            <?php echo h(date('Y/m/d H:i:s', $book['Book']['modified'])); ?>
        </td>
    </tr>
</table>

<p>
<?php
    echo $html->link
    (
        '書籍情報一覧',
        array
        (
            'controller' => 'books',
            'action' => 'index'
        )
    );
?>
</p>

詳細画面ではread()を使用してレコード情報を取得した。

これら2画面をWebブラウザで表示してみよう。

書籍一覧画面(books/index)。ヘッダをクリックするとソート、Idをクリックすると詳細画面へ遷移する

書籍詳細画面(books/view)。Paginatorではなくreadを使って実装している

定数「DEBUG」を定義しておくと、FX.phpのデバッグ機能が有効になる。どの順番・タイミングでFileMakerにアクセスしているかがわかり、デバッグ時に有用

意図したレコードを取得していない、などの問題が起きている場合はこの機能を使って問題を特定し、コントローラやdbo_fmcakemix.phpを修正する

今回あたらしく使用している機能は次の2点。

グローバル関数 - h

h(string $text, string $charset = null)
  • $text: 変換したい文字列を指定
  • $charset: 文字コードを指定。nullの場合はConfigre::read('App.encoding')が使用される

h()はhtmlspecialchars()のラッパー。h($text)はhtmlspecialchars($text, ENT_QUOTES, $charset);と同じ意味となる。$charsetが省略された場合、/config/core.phpで定義されているApp.encodingがデフォルト値となる。

HTMLヘルパー - link

link(string $title, mixed $url = null, array $htmlAttributes = array(), string $confirmMessage = false, boolean $escapeTitle = true)

HTMLヘルパー(HtmlHelper)は整形済みのマークアップを生成してくれる機能。$html->link()はHTMLリンクを作成する。

  • $title: リンク文字列を指定
  • $url: アンカーを指定
  • $htmlAttributes: 配列で属性と値を指定
  • $confirmMessage: 画面遷移時に指定した確認メッセージを表示。falseの場合は表示しない
  • $escapeTitle: $titleをエスケープするかしないかを定義

HTMLヘルパーではこのほかにもおおくの機能が用意されている。

  • $html->charset(): ドキュメントの文字コードを指定するメタタグを生成。デフォルトはUTF-8
  • $html->css(): CSSスタイルシートへのリンクを生成。CSSはあらかじめ/app/webroot/cssに配置しておくこと
  • $html->meta(): 各種メタタグを生成
  • $html->url(): コントローラとアクションの配列を渡すことで適切なパスを生成。空欄の場合はREQUEST_URIが返る

$urlにコントローラとアクションの配列を渡すことで、適切なパスを生成してくれる。アクションへのリンクを作成する際に活用されたい。