Zend Framework 2のレイアウトテンプレート内にテンプレートを読み込ませる
こんにちは、株式会社ライオンハートの鵜飼です。
前回に引き続きZend Framework 2についてのメモです。今回はView周りの処理で、通常のテンプレートとは別にレイアウトテンプレートの中に異なるテンプレートを読みこませる方法についてのメモです。
レイアウトテンプレートにアクセスする
コントローラ内からレイアウトテンプレートにアクセスするには、layout
メソッドを実行することでLayoutクラス返ってきますので、値を代入することでレイアウトテンプレート内で扱うコトが出来ます。
<?php namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; class FoodController extends AbstractActionController { public function indexAction() { $layout = $this->layout(); $layout->foo = 'bar'; } }
コレでレイアウトテンプレート内で$this->foo
として扱うことが出来ます。
レイアウトテンプレートにテンプレートを読み込む
LayoutクラスのaddChild
メソッドにModelInterface
を渡すと、レイアウトテンプレート上で展開してくれるので、そちらを利用します。
<?php namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; class FoodController extends AbstractActionController { public function indexAction() { $childModel = ViewModel(); $childModel->setTemplate('path/to/childTemplate'); $this->layout()->addChild($childModel, 'foo'); } }
変数を渡した時と同様に、レイアウトテンプレート上で$this->foo
として扱うことが出来ます。
共通関数にする
しかし、毎度上記例の様な記述をするのは少し面倒なので共通関数として用意してみました。
<?php namespace Application\Controller; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; abstract class AbstractController extends AbstractActionController { /** * Layoutに対してテンプレートの実行結果を変数として渡す * * @param string $name 変数名 * @param string $path テンプレートパス */ protected function addLayoutTemplate($name, $path) { $childModel = new ViewModel(); $childModel->setTemplate($path); $this->layout()->addChild($childModel, $name); } }
あとはコントローラでAbstractController
を継承してaddLayoutTemplate
を実行すると、レイアウトテンプレートにテンプレートを読みこませるコトが可能です。