application.ini と独自アクションヘルパーでモジュール毎のレイアウトを実装する。

ZendFramework にはモジュール毎にレイアウトを変更する機能が備わっておりません。*1
ですので、アクションヘルパーを自作し、実装することにします。
尚、自作したクラスは独自ライブラリとしてパッケージングしておくことにします。

application.ini にオートロードするネームスペース*2を記述します。
任意のネームスペースを記述して下さい。※ここでは Peta としています。

; Namespaces
autoloaderNamespaces[]                        = "Peta"

次にモジュールを利用出来るように以下を記述します。
Front Controller の項目の一行目はデフォルトで呼ばれるモジュールも他のモジュールと同じ階層に設置する為の記述です。

; Front Controller
resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/default/controllers"
resources.frontController.moduleDirectory     = APPLICATION_PATH "/modules"

; Module
resources.modules[]                           =

そして、レイアウトを各モジュール毎に設定します。
以下の例は、「default」「hoge」「fuga」のモジュールに設定しています。

; Layout
resources.layout.layout                       = "layout"
default.resources.layout.layoutPath           = APPLICATION_PATH "/modules/default/layouts/scripts"
hoge.resources.layout.layoutPath              = APPLICATION_PATH "/modules/hoge/layouts/scripts"
fuga.resources.layout.layoutPath              = APPLICATION_PATH "/modules/fuga/layouts/scripts"

application.ini の設定はここまで。次に独自クラスを実装していきます。
先の説明でネームスペースを設定しましたので、次のようなディレクトリ構造になるようにファイルを作成します。

/library/Peta/Controller/Action/Helper/LayoutLoader.php

ファイルの内容は以下の通り。

<?php
require_once 'Zend/Controller/Action/Helper/Abstract.php' ;
class Peta_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch()
    {
        $bootstrap  = $this->getActionController()->getInvokeArg('bootstrap');
        $config     = $bootstrap->getOptions();
        $module     = $this->getRequest()->getModuleName();
        if (isset($config[$module]['resources']['layout'])) {
            $this->getActionController()
                 ->getHelper('layout')
                 ->setOptions($config[$module]['resources']['layout']);
        }
    }
}

どのように動作するかですが、コントローラが preDispatch されたタイミングでレイアウトを設定しなおします。*3

最後に作成したアクションヘルパーを Bootstrap で登録して完成です。

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initLayoutHelper()
    {
        $this->bootstrap('frontController');
        Zend_Controller_Action_HelperBroker::addHelper(new Peta_Controller_Action_Helper_LayoutLoader());
    }
}

レイアウトを一つのディレクトリで管理する。

前述の方法では、モジュール毎にレイアウト用ディレクトリを設置しなくてはなりません。
もし、モジュール毎にレイアウト用ディレクトリを設置したくない!一括管理したい!って人は application.ini のレイアウト部分を以下のように変更して下さい。

resources.layout.layoutPath     = APPLICATION_PATH "/layouts/scripts"
default.resources.layout.layout = "default"
hoge.resources.layout.layout    = "hoge"

これは APPLICATION_PATH ディレクトリ直下にレイアウト用ディレクトリを作成し、モジュールのファイル名でレイアウトスクリプトを設置する事でレイアウトを一括管理する記述例です。

*1:ひょっとしたら私の知識不足なだけかもしれませんが・・・。

*2:ここで言うネームスペースはPHPが提供するネームスペースの機能とは異なり、ZendFrameworkが提供しておる擬似ネームスペースの事を指します。

*3:preDispatch 前に一度設定されるので、しなおすという表現にしてます。