2009-12-09 1 views
1

나는 현재 각 모듈의보기/스크립트/layout.phtml 파일의 레이아웃 스크립트를 찾는 젠드 설정을 가지고 (예 : /application/modules/moduleName/scripts/layout.phtml) . 이는 application.ini 파일에서 layout []을 nothing (공백)으로 설정하는 것입니다 (resources.layout[] =)젠드 레이아웃 - A "스마트"레이아웃 선택

많은 모듈이 동일한 레이아웃을 공유 할 수 있습니다. 나는 똑같은 레이아웃을 사용하는 각 모듈에 똑같은 레이아웃을 복사하고 싶지 않다. 나는 /layoutpath/layout.phtml 사용하는 것이 resources.layout.layoutpath = /layoutPath 모든 것을 같은 특정 경로를 설정하여 하나의 레이아웃 스크립트를 사용하여 모든 것을 설정할 수 있습니다 알고, 내가 $this->_helper->layout->setLayout('foobaz');

를 사용하여 (초기화 또는 전체 컨트롤러) 개별 페이지를 설정할 수 있습니다 알고

문제는 일부 모듈은 '표준'이외의 다른 레이아웃을 가지고 것입니다, 나는 컨트롤러 나 액션별로 그것을 설정하지 않는다는 것입니다. 한 곳에서 설정하거나 (코드/Zend에 의해 직관적으로 알아 낸) 전체 모듈에 설정하려고합니다. 이상적인 방법은 현재의 상태를 설정하는 것이지만 모듈에 자체 layout.phtml이없는 경우 기본 모듈의 레이아웃을 사용합니다.

그래서 ... 어떻게해야합니까?

답변

2

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 당신은 frontcontroller 플러그인을 쓸 수 있습니다

메이크업 모듈 관리자 및 기본 :;

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에서는 작동하지 않으며 유지 관리가 더 어려워집니다.

더 나은 방법은 레이아웃을 설정하기위한 부트 스트랩에 만드는 방법입니다.

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에 사용 write your own application resource는 없습니다.

1

당신은 몇 단계

1 단계에서 자신의 레이아웃 선택을 설정할 수 있습니다.

2 단계 : 이 layout.phtml에 넣어 관리/레이아웃/스크립트 및 기본/레이아웃/스크립트 각 모듈에 레이아웃 폴더를 만들

3 단계 : 는 응용 프로그램에서 layout.phtml 파일을 삭제/레이아웃/스크립트.

4 단계 : 라이브러리 내부의 플러그인 폴더를 만들고 플러그인을합니다.

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

단계로 PHP 5 :

열려있는 응용 프로그램/CONFIGS은/Appication.ini는 파일 편집이 6 단계

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

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

등 :

열린 부트 스트랩 파일 응용 프로그램/부트 스트랩 안에 코드를 넣으십시오

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