1

現在、各モジュールのview/scripts/layout.phtmlファイル(つまり、/application/modules/moduleName/scripts/layout.phtml)でレイアウトスクリプトを探すZendセットアップがあります。これは、application.ini ファイルで layout[] を何もしない (空白) に設定することによって行われます ( resources.layout[] =) 。

問題は、多くのモジュールが同じレイアウトを共有している可能性があることです。同じ正確なレイアウトを、それを使用する各モジュールにコピーしたくありません。特定のパスを設定することで、1 つのレイアウト スクリプトを使用するようresources.layout.layoutpath = /layoutPathにすべてを設定できることを知っています。すべてが /layoutpath/layout.phtml を使用します。$this->_helper->layout->setLayout('foobaz');

問題は、一部のモジュールには「標準」以外の異なるレイアウトがあり、コントローラーまたはアクションごとに設定したくないことです。モジュール全体に設定し、1 か所に設定したい (または、直感的にコード/Zend で自動的に把握したい)。理想的には、現在のようにセットアップされますが、モジュールに独自の layout.phtml がない場合は、既定のモジュールのレイアウトが使用されます。

それで...どうすればいいですか?

4

3 に答える 3

2

いくつかの解決策があり、独自の戦略を選択してください

1 アクションコントローラーの拡張

class App_Controller_Action extends Zend_Controller_Action 
{

    public function init()
    {
        parent::init();

        $moduleName = $this->getRequest()->getModuleName();
        $layoutPath = APPLICATION_PATH . '/modules/' . $moduleName . '/layouts';
        if (is_dir($layoutPath)) {
            $this->view->addScriptPath($layoutPath);
        }    
    }
 }

IndexController extends App_Controller_Action ...
レイアウトファイルがディレクトリに存在する場合は通常どおりに実行しますAPPLICATION_PATH . '/modules/' . $moduleName . '/layouts'-デフォルトのレイアウトの代わりに使用されます

2 フロントコントローラープラグインを書くことができます

class App_Controller_Plugin_ModuleSwitcher extends Zend_Controller_Plugin_Abstract
 {
     protected $_view = null;

     public function routeShutdown(Zend_Controller_Request_Abstract $request)
     {
         $moduleName = $request->getModuleName();

         Zend_Layout::startMvc();
         $layout = Zend_Layout::getMvcInstance();
         $layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $moduleName . '/layouts')->setLayout($moduleName);

         return $request;
     }
 }

別の解決策をグーグルで検索することを忘れないでください;)

于 2009-12-18T23:02:05.980 に答える
1

いくつかの手順で独自のレイアウトセレクターを設定できます

ステップ 1: モジュールを管理者およびデフォルトにします。

ステップ 2: 各モジュールにレイアウト フォルダーを作成し、admin/layouts/scripts および default/layouts/scripts を layout.phtml に配置します。

ステップ 3: Application/layouts/scripts から layout.phtml ファイルを削除します。

ステップ 4: ライブラリ内に Plugin フォルダーを作成し、Plugin.php を次のように作成します。

class Plugin_Layout extends Zend_Controller_Plugin_Abstract 
{

   public function preDispatch(Zend_Controller_Request_Abstract $request)

    {
        $layoutPath = APPLICATION_PATH . '/modules/' . $request->getModuleName() . '/layouts/scripts/';
        Zend_Layout::getMvcInstance()->setLayoutPath($layoutPath);
    }
}   

ステップ 5:

Application/configs/Appication.ini ファイルを開き、次のように編集します。

;resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.layout.layout = "layout"
;register your plugin

autoloaderNamespaces[] = "Plugin"
resources.frontController.plugins[] = "Plugin_Layout"

ステップ 6:

ブートストラップファイルを開くアプリケーション/ブートストラップはコードを中に入れます

protected function _initAutoload()

 {

        $loader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => '',
                    'basePath' => APPLICATION_PATH . '/modules/'
                ));

        return $loader;
    }

    protected function _initPlugins()

{

        $this->bootstrap('frontcontroller');
        $fc = $this->getResource('frontcontroller');
        $fc->registerPlugin(new Plugin_Layout());
}
于 2012-08-18T04:59:25.080 に答える
0

最も簡単な解決策は、モジュール レイアウト ファイルとなるものをデフォルト レイアウトにポイントするシンボリック リンクを作成することです。これは Windows では機能せず、保守が難しくなります。

より良いのは、レイアウトを設定するメソッドを Bootstrap に作成することです。

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initLayoutScript(){
        //ensure layout is setup
        $this->bootstrap(array('layout', 'FrontController'));

        $layout= $this->getResource('layout');

        $front = $this->getResource('FrontController');

        //do something with $layout and $front - set layout script/path etc based on request 
        //You could use file_exists to detect module layout scripts 

    }

}

詳細については、 http://framework.zend.com/manual/en/zend.application.quick-start.html#zend.application.quick-start.resourcesを参照してください。

最後に、Zend_Application で使用する独自のアプリケーション リソースを作成できます。

于 2009-12-09T18:12:22.733 に答える