2009-12-09 6 views
1

В настоящее время у меня есть настройка Zend для поиска сценария макета в каждом представлении/скриптах/файле layout.phtml каждого модуля (например: /application/modules/moduleName/scripts/layout.phtml) , Это связано с установкой макета [] на ничего (пустое) в файле application.ini (resources.layout[] =)Zend Layout - селектор макетов «Smart»

Проблема в том, что многие модули могут иметь один и тот же макет. Я не хочу копировать один и тот же точный макет в каждый модуль, который его использует. Я знаю, что могу установить все, чтобы использовать один сценарий макета, задав определенный путь, например resources.layout.layoutpath = /layoutPath, и все будет использовать /layoutpath/layout.phtml, и я знаю, что могу установить отдельные страницы (или целые контроллеры в init) с помощью $this->_helper->layout->setLayout('foobaz');

Проблема в том, что некоторые модули будут иметь разные макеты, отличные от «стандартных», и я не хочу устанавливать его на основе «Контроллер» или «Действие». Я хочу установить его для всего модуля, установленного в одном месте (или интуитивно понятного с помощью кода/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' каталоге - это п вместо по умолчанию

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

и не забудьте Google для других решений;)

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 внутри библиотеки и создайте плагин.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:

открыт Применение/конфиги/файл 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()); 
}