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