CakePHP : ビューの作成

MVC(Model View Controller)の「V」にあたるビューを作成します。

ビューは、表示・入出力を受け持ちます。

参考:「MVCモデルとは何ですか・・・」など

CakePHPの規約

ビューの規約は次のようになっています。

  • アクション名(メソッド)とついになるようにビュー(テンプレート)名前をつけると
    コントローラーで明示する必要がなくなる。
  • 拡張子は.thtml

ビューの作成

ビューは、「/app/views/コントローラー名/」に作成します。

ここでは、forumsコントローラーのindexメソッドに対応するよう次のようにビューを作成します。

/app/views/forums/index.thtml

前回までで作成したカテゴリーを表示するようindex.thtmlを次のように作成します。

<?php foreach ($categories as $category) { ?>
<ul>
<li><?php echo h($category['Category']['id']) ?></li>
<li><?php echo h($category['Category']['name']) ?></li>
<li><?php echo h($category['Category']['description']) ?></li>
</ul>
<?php } ?>

コントローラーのindexアクションから渡される値を順に表示しています。

# コントローラのindexメソッド
$this->set('categories',$this->Category->findAll());

echoにつづく「h」は、htmlspecialcharsを省略した関数です。

CakePHPのビューは、そのままphpのコードを記述するようです。

実際の表示

表示イメージ

おまけ(h関数)

htmlspecialcharsは、HTMLにおいて特殊な意味を持つ文字を表示するために変換を行ってくれる関数です。 例えば、&を&amp;に変換します。

このhtmlspecialcharsをCakePHPでは、次のように定義しています。(cake/basics.php)

function h($text) {
    if (is_array($text)) {
        return array_map('h', $text);
    }
    return htmlspecialchars($text);
}

上記関数を通すことで、配列でもhtmlspecialchars関数を実行した事と同じになります。

CakePHP.orgの方でも修正されているようですが、htmlspecialcharsを使用する場合 ENT_QUOTESを引数に指定しないとセキュリティ上問題があります。

CakePHPのサイトで確認したところ、次のように修正されるようです。

function h($text, $charset = null) {
    if (is_array($text)) {
        return array_map('h', $text);
    }
    if (empty($charset)) {
        $charset = Configre::read('App.encoding');
    }
    if (empty($charset)) {
        $charset = 'UTF-8';
    }
    return htmlspecialchars($text, ENT_QUOTES, charset);
}