2009-12-09 111 views
1

我目前有Zend設置在每個模塊的view/scripts/layout.phtml文件(即:/application/modules/moduleName/scripts/layout.phtml)中查找佈局腳本。 。這是通過在application.ini文件(resources.layout[] =)中設置layout []爲空(空白)Zend佈局 - 一個「智能」佈局選擇器

問題是許多模塊可能共享相同的佈局。我不想將相同的確切佈局複製到使用它的每個模塊中。我知道我可以通過設置一個特定的路徑(如resources.layout.layoutpath = /layoutPath)來設置一切,以便使用一個佈局腳本,並且所有內容都將使用/layoutpath/layout.phtml,並且我知道可以使用$this->_helper->layout->setLayout('foobaz');

設置單個頁面(或整個控制器,在init中)

問題在於某些模塊將具有不同的佈局,而不是「標準」佈局,而且我不想將其設置爲按控制器或按操作基準。我想爲整個模塊設置它,在一個地方設置(或直接通過代碼/ Zend自動計算出來)。理想情況下,它會設置它當前的狀態,但如果一個模塊沒有自己的layout.phtml,它將使用默認模塊的佈局。

那麼...我該怎麼做呢?

回答

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'目錄中存在 - 這將NE代替的默認佈局

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; 
    } 
} 

不要忘記谷歌另一個解決方案)

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

最後,您可以使用write your own application resource與Zend_Application一起使用。

1

你可以在幾步

1步中設置自己的佈局選擇。

步驟2: 每個模塊管理/佈局/腳本 和默認/佈局/腳本 投入layout.phtml在創建佈局文件夾

步驟3: 刪除應用的layout.phtml文件/佈局/腳本。

第4步: 使庫內的Plugin文件夾和make 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:

開申請/ 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:

打開引導文件的應用/ Bootstrap 將代碼放入

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()); 
}