LionHeart SD BLOG

株式会社ライオンハート システムデザインの技術ブログ

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を実行すると、レイアウトテンプレートにテンプレートを読みこませるコトが可能です。

参考サイト