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>
</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>
</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ブラウザで表示してみよう。
今回あたらしく使用している機能は次の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にコントローラとアクションの配列を渡すことで、適切なパスを生成してくれる。アクションへのリンクを作成する際に活用されたい。