たきゃはしです

もう日常ブログにしよう

CakePHP2.X 「view blocks」の使い方

2012-06-28 更新


CakePHP2.1から追加。ビュー・レイアウトの役割をより明確に。


「view blocks」 この名前を見てもピンと来ないでしょう、しかし使ってみると便利なもんです。

今回は「view blocks」にある「$this->assign()」と「$this->fetch()」を使った簡単なTipsを紹介します。

やってる内容といえば「Viewで割り当てたコードを:$this->assign() 、レイアウトの任意の箇所で読み込む:$this->fetch()」って感じです。


文字だけでは、まだ完璧には理解できないと思います!

利用例をTipsとして紹介していますので、どうぞ

  • 目的
    • コントローラのアクション別に、titleタグのサブタイトルを変更したい
    • サイトタイトル|サブタイトル、サイトタイトル|ほげほげ、サイトタイトル|ふがふが
  • タスク
    • レイアウトの任意の箇所でコードを読み込む準備($this->fetch())
    • ビューでコードを割り当てる($this->assign())


まだ把握できなくても大丈夫です。では、いきます。

レイアウトの任意の箇所でコードを読み込む準備($this->fetch)

・app/View/Layouts/default.ctp

<!DOCTYPE html>
<html>
    <head>
        <title><?php echo 'サイトタイトル' . $this->fetch('subTitle'); ?></title>
    </head>
    <body>
        <?php echo $this->fetch('content'); ?>
    </body>
</html>

「fetch」は「読み込む」という意味で、任意の名前を指定し、コードを読み込む準備をしています。今回は'subTitle'という名前にしました。

ビューでコードを割り当てる($this->assign)

・app/View/Pages/hogehoge.ctp

<?php
$this->assign('subTitle', '|ほげほげ');
?>
<p>これは「ほげほげ」のアクションです</p>

・app/View/Pages/hugahuga.ctp

<?php
$this->assign('subTitle', '|ふがふが');
?>
<p>このアクションは「ふがふが」です</p>

「assign」は「割り当てる」という意味で、「fetch」で指定した名前を第一引数に、第二引数に好きなコードを割り当てることが出来ます。たったこれだけです。

ToDoリストの結果

・pages/hogehoge

<!DOCTYPE html>
<html>
    <head>
        <title>サイトタイトル|ほげほげ</title>
    </head>
    <body>
        <p>これは「ほげほげ」のアクションです</p>
    </body>
</html>

・pages/hugahuga

<!DOCTYPE html>
<html>
    <head>
        <title>サイトタイトル|ふがふが</title>
    </head>
    <body>
        <p>このアクションは「ふがふが」です</p>
    </body>
</html>

assignしていないビューのソースは$this->fetch('content')に読み込まれます。
ちなみに、fetchに値が設定されていない場合でもエラーにはならず、空を出力します。

応用編:$this->element()との連携

「view blocks」は柔軟で応用が利きます。

色々と割愛しますが基本的には同じで、Elementを作成して


・app/View/Pages/hugahuga.ctp

<?php $this->assign('subMenu', $this->element('subMenu/' . $this->action)); ?>


こんな感じで割り当てれます。

読み込み方は・・・


・app/View/Layouts/default.ctp

<?php echo $this->fetch('subMenu'); ?>


「view blocks」には他に、start(), append()やend() などのメソッドがあり、ViewクラスにExtending Viewsなどの新機能も実装されておりますので、ぜひマニュアルをご覧ください。
 →http://book.cakephp.org/2.0/en/views.html