Zend Framework - Zend_Layout編

HOME | TOP

■ レイアウトは自前で用意する

Zend_Layoutという名前ではありますが、レイアウト済みの空洞のファイルを必要なパターン数だけ自前で用意しておくことになります。
(デフォルトでlayout.phtmlというファイル名になります。)

この自前で用意したレイアウト済みの空洞ファイルは『レイアウトスクリプト』と呼ばれます。

スクリプトと呼ばれるとおり、レイアウト済みのエリア分けされた空洞位置に、表示させたい内容が反映されるように

のように書いておくことになります。

Zend_Layoutも当然レンダリングするので内部でZend_Viewを使っていることになります。
なのでビュースクリプトで使えるビューヘルパ類はそのまま使えます。

サイト内の複数のページを同じレイアウトにしたい場合には同じレイアウトスクリプトを呼び出せばいいということになります。

■ Zend_Layoutを使ってみる



▽ MVCを使わない場合のZend_Layoutの使い方

まずはいつものようにクラスからオブジェクトを作成(new演算子を使う)してみます。

実行スクリプト [htdocs/index.php]

そのままではレイアウトスクリプトの置き場所がわからないのでsetLayoutPath()メソッドを使って教えることになります。

デフォルトではレイアウトスクリプトとして使われるファイル名がlayout.phtmlになっているのでこれを変更したい場合にはsetLayout()を使って変えることができるようになっています。
また、拡張子も変えたい場合にはsetViewSuffix()メソッドを使えばできます。



レイアウトスクリプト [htdocs/foo.phtml]

「$this->layout()->変数名」という形式で値参照できます。

一連の処理としてはこんな感じになります。あとはいい感じのレイアウトを用意できるかどうかはあなた次第といったことろです。





▽ MVCを使う場合のZend_Layoutの使い方

先ほどはMVCを使わないシンプルな使い方でしたが、今度はMVCでZend_Layoutを使ってしまおうというお話です。

フロントコントローラ [htdocs/index.php]

MVCで使う場合はその処理構造から、
フロントコントローラ(index.php)で設定にまつわるレイアウトスクリプト置き場を教えて、 実質的な処理をするアクション側ではオブジェクトを取得してなんやかんやちょっかい出していく感じになるので、オブジェクトの作成自体はフロントコントローラで作成して教えたレイアウトスクリプト置き場の値を保持してもらうことになります。

それを行うのがstartMvc()という静的メソッドになります。



アクションコントローラ [application/controllers/IndexController.php]

「$this->_helper->layout」とすることでフロントコントローラで作成したレイアウトオブジェクトにいきなりアクセスできるようになっています。
これはアクションヘルパーが助けてくれているのでできることですが、もし別の方法でレイアウトオブジェクトを取得するとしたら

$layout = Zend_Layout::getMvcInstance();

を使うことになります。



ビュースクリプト [application/views/scripts/index/index.phtml]

この内容が丸々レイアウトスクリプトのメンバ変数「$this->layout()->content」位置に置き換えられることになります。



レイアウトスクリプト [application/views/layouts/layout01.phtml]

すでに書きましたが、「$this->layout()->変数名」で値参照することになります。ビューヘルパー類も使えます。

個別に置き換えたいmenuと、アクションごとの内容として置き換えたいcontentなど、レイアウト済みのエリア分けされた部分にいろいろと置き換えているのが分かります。

言うなれば最終的に表示させるHTMLソースの設計図といった感じですかね。


■ レイアウト処理の本質を考える

1サイトの持つページ間では

HTML文書に使っている文字コード、スタイルシートはだいたい共通しています。

更に突き進めていくと、



タイトルやレイアウト、フッターといった共通部分がページ間にある場合が多いことがわかります。

ここまで共通してくると、ページ間に統一性があることでサイト全体のまとまった感や色合いが醸し出せると思います。



要はZend_Layoutのやってることは、サイトで使用するレイアウトのパターン数だけページを用意しておくことでページ間で共通の部分をくくり出しておき、ページごとに変わるコンテンツ部分のみを入れ替えるだけにするための処理であると言えると思います。



そう考えると少し疑問がわいてきます。

なぜMVCでビュースクリプトを使っているのにわざわざレイアウトスクリプトまで使う必要があるのかと・・・
これって二度手間ってやつじゃないかと・・・



考えてみたらアクション処理後に呼び出されるビュースクリプトは、デフォルトだと「application/views/scripts/コントローラ名/アクション名.phtml」になります。
このビュースクリプトには当然レイアウトスクリプトのようにレイアウトを書いておくことができるわけです。

ただ、それをやるとアクションの数だけレイアウトを書いたビュースクリプトを用意しなければいけなくなってしまいます。
できればレイアウトは一箇所にくくり出して集約させたい。
1パターンのレイアウトは1ファイルで収めたいということになります。



そこでかゆいところはかいてあげますよと言わんばかりに登場したのがZend_Layoutということになるでしょう。

でもよくよく考えてみたらこれってアクションとビュースクリプトの関係を使えばZend_Layoutと同じようなことが簡単にできるんじゃないの?

という疑問がわいたので考えてみました。



[application/controllers/IndexController.php]

こんな感じで書けばZend_Layoutと同様のことができると思うので、二度手間にならない気がします。

アクションメソッド内およびそれに対応するビュースクリプトでは、レイアウトされたページ内に表示させる1エリアとしてのコンテンツ処理に集中できるということになります。

もちろん、もっと広くアクションコントローラを飛び越えてレイアウトを共有したい場合にはアクションヘルパーを自作することでできると思います。



そう考えると初めは便利だと思っていたZend_Layoutって必要なのか?と思えてきます。
いやむしろMVCの方が強力な処理構造になっていて凄すぎると言ったほうがいいかも知れません。



よりシンプルで頑丈なアプリケーション作りを目指すわたし的結論としては、Zend_Layoutを使うとしたらMVC以外で使うという考えに帰結しました。(なぜかZend_LayoutにはMVCを使う感バリバリのメソッド名が用意されてはいますが)


2010(C)Mingw