Zend Framework modules [opgelost]
Momenteel zijn wij bezig met het bouwen van een vrij grote applicatie in Zend Framework.
Om het overzichtelijk te houden en gemakkelijk te onderhouden hebben we gekozen om ieder onderdeel in een module onder te brengen, deze module moet zefstandig zijn, oftewel zijn eigen configuratie, layout, navigatie, etc.
Alleen bij het onderdeel navigatie hebben wij een probleem, doordat zf iedere module bootstrapt, ook als deze niet gebruikt wordt, wordt de "default" navigatie geladen.
Om dit probleem te omzeilen heb ik een plugin geschreven die naast de layout ook het juiste navigatie bestand moet laden.
Plugin:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Phoenix_Module_Plugin_ModuleConfig extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$view = new Zend_View();
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
}
}
?>
class Phoenix_Module_Plugin_ModuleConfig extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$view = new Zend_View();
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
}
}
?>
Ik zie waarschijnlijk iets over het hoofd, ondanks dat het menu bestaat (bij een var_dump in de plugin zie ik dat het menu daadwerkelijk wordt gemaakt), alleen als ik het menu echo in mijn view krijg ik niks.
Weet iemand een oplossing?
Ik gok dat dit mogelijk de oplossing is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class Phoenix_Module_Plugin_ModuleConfig extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$view = $layout->getView();
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
}
}
?>
class Phoenix_Module_Plugin_ModuleConfig extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$view = $layout->getView();
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
}
}
?>
En ook denk dat je layout object op die manier geen geldige referentie is maar dat weet ik niet zeker. Mocht mijn voorbeeld niet werken kun je de layout ook als volgt ophalen:
Code (php)
1
2
3
4
2
3
4
<?php
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$layout = $bootstrap->getResource('layout');
?>
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$layout = $bootstrap->getResource('layout');
?>
En dan uiteraard $layout->getView() .. etc.
Gewijzigd op 21/02/2012 19:30:43 door kees Schepers
Alleen het layout gedeelte werd uitgevoerd.
Met behulp van viewRenderer heb ik het probleem opgelost en werkt het nu perfect.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->initView();
$view = $viewRenderer->view;
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
}
?>
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$layout = Zend_Layout::startMvc();
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->initView();
$view = $viewRenderer->view;
$layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/scripts/');
if (file_exists(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml')) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/modules/' . $module . '/configs/navigation.xml', 'nav');
$navigation = new Zend_Navigation($config);
$view->navigation($navigation);
}
}
?>