勘違いや誤解が多く、実はあまり知られていないレイアウト機能について
解説します。
これが意外とハマり所で、苦労している方も多いのでは無いでしょうか?
レイアウトは基本的となるヘッダーやフッターなどを共通化し、
フレームの様に扱う便利な機能です。
しかし、全てのページでまったく同じレイアウトを使うだけだと
使い道が限られ、あまり便利さを感じません。
そこで、例えばモジュール毎にレイアウトを分けたいとか、
コントローラによって分けたいとか、アクションによって分けたいとか、
閲覧ブラウザや、閲覧者の権限や設定等で分けたいなど、
色々と要望が出てくるかと思います。
今回は、そんなレイアウト機能を簡単に、動的に変更する方法を解説します
勘違いの元、基本的なデフォルト設定に記述場所
ZendFramework2(ZF2)の公式リファレンスでも、
Viewの項目にあるレイアウトの指定方法は
モジュール毎にフォルダ分けされているconfig/module.config.phpに指定すると書かれています。
'view_manager' => array( 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => array( // レイアウトを設定する 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'user/index/index' => __DIR__ . '/../view/user/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ), 'template_path_stack' => array( __DIR__ . '/../view', )
しかし、このファイルはモジュール間でマージされるので、
モジュール毎にレイアウトを分けたり、大きなくくりでのページ単位でのレイアウトを決めたり
コントローラ間で共通のレイアウトを決める等は出来ません。
良く、この仕様とリファレンスの解説方法によってレイアウトの扱いを不便に感じる方が多いようです。
しかし、実際にはちゃんと扱いやすい様なメソッドが用意されており、
途中でレイアウトを動的に指定する事も出来てしまいます。
Controller PluginsのLayout Pluginでレイアウト指定!
動的にレイアウトを変更する為には、専用のプラグインを使用します。
それは、以前紹介したリダイレクト先へメッセージを伝えるFlashMessengerや、
リクエストパラメータを取得するParams Pluginの様に、
MVCロジック内のAbstractActionControllerを継承したコントローラ内で使えるプラグインとして
用意されています。
その名も『Layout Plugin』
使い方はとっても簡単です
namespace App\Controller; // コントローラ use Zend\Mvc\Controller\AbstractActionController; class indexController extends AbstractActionController { /* 共通トップページ ----------------------------------------------------------------------------------*/ public function indexAction() { // レイアウトを設定 $this->layout('layout/mylayout'); return( new ViewModel() ); } }
上記の様に、$this->layout('レイアウトファイル名');という形でレイアウトファイルを指定します。
指定するファイルは、拡張子を抜いた名前です。
また、
$this->layout()->setTemplate('layout/mylayout');
の様に書いても同じ動作をします。
結構このプラグインを知らなくて不便を感じている方が多いように思えたので
紹介してみました。
実際には私はスマーティとの連携を行って使用していますが、
問題なく、同じ様にレイアウト機能を動的に使う事が出来ています
因みに、スマーティの導入方法は下記を参照してください。
ZendFramework2(ZF2)でSmarty3を使う方法!
ZendFramework2(ZF2)からは設定する項目も多くて、
設定の影響が何処まで及ぶのかが明確で無いので
情報が少ない内は苦労するかも知れません。
ですが、調べて見ると意外と便利なメソッドが用意されていたり、
規約とは違った設定ベースなので、まとめて記述した設定は
あくまでデフォルトとして扱い、必要あらば設定を途中で変更出来る柔軟性ももっています。
リファレンスは丁寧で詳細が書かれていますが、
もう少し纏め方を工夫してくれたらフレームワークとしてもっと入り易いのになーっと感じます
(多分ライブラリ的な使い方も意識しての作りだと思いますが・・・)
この辺りの躓きで、ZendFramework2からZendFramework1へバージョンを落として使用している人も多いので
この記事をきっかけにZendFramework2を使っていただければと思います。