Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF]Generowanie menu dla każdego modułu - wczytywany tylko 1
Forum PHP.pl > Forum > PHP > Frameworki
IceManSpy
Witam

Nie widziałem jak dokładnie opisać w temacie mój problem, dlatego rozszerzam go tutaj. Moja aplikacja ma strukturę modułową, składa się z student, professor i admin. Dla każdego z nich są inne controllery, modele, widoki i layouty. Wszystko działa pięknie, jednak mam problem z menu.

Dla każdego modułu mam napisane menu w postaci pliku php jako tablica, coś na takiej zasadzie:
  1. 'label' => 'Moje konto',
  2. 'module' => 'student',
  3. 'controller' => 'index',
  4. 'action' => 'index',
  5. 'route' => 'default'
  6. ),

Pliki są wrzucone do głównego folderu modułu i nazywają się odpowiedniej: menu_stu.php , menu_pro.php, menu_adm.php . Dla każdego moduło w Bootstrapie dodałem odpowiednio wczytanie tego pliku. Dla studenta:
  1. protected function _initNavigation()
  2. {
  3. $this->bootstrap('layout');
  4. $layout = $this->getResource('layout');
  5. $view = $layout->getView();
  6.  
  7. $config = require APPLICATION_PATH . '/modules/student/menu_stu.php';
  8. $navigation = new Zend_Navigation($config);
  9. $view->navigation($navigation);
  10. }

Dla profesora:
  1. $config = require APPLICATION_PATH . '/modules/professor/menu_pro.php';
  2. $navigation = new Zend_Navigation($config);
  3. $view->navigation($navigation);

I dla admina:
  1. $config = require APPLICATION_PATH . '/modules/admin/menu_adm.php';
  2. $navigation = new Zend_Navigation($config);
  3. $view->navigation($navigation);


Mój problem polega na tym, że bez względu na jaki moduł wejdę, to zawsze jest wczytywane menu ze studenta. Jeśli w Boostrapie dla profesora zmienię nazwę pliku z menu z menu_pro.php na np menu.php, to wtedy pluje się, że nie ma takiego pliku (co jest logiczne).
Teraz, aby było śmiesznie jeśli usunę cały folder (moduł) student, to wczytywane jest menu dla profesora. Czyli wychodzi na to, że wczytywane jest menu jakby ostatnie z listy.

Jak to rozwiązać? sad.gif
batman
Dzieje się tak dlatego, że ZF inicjalizuje wszystkie moduły niezależnie od tego, który faktycznie jest wykorzystywany. Jakiś czas temu pisałem o tym na blogu - http://blog.wilgucki.pl/2010/05/moduy-w-zend-framework.html (czwarty punkt).
IceManSpy
A główny plik Boostrapa to jest ten poza modułem, prawda?
batman
Prawda.
IceManSpy
Zrobiłem tak:
1. W folderze library założyłem folder Plugins a w nim plik ModuleLoader.php o zawartości:
  1. <?php
  2. class Plugins_ModuleLoader extends Zend_Controller_Plugin_Abstract
  3. {
  4. public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
  5. {
  6. $module = $request->getModuleName();
  7.  
  8. // moduł domyślny można ominąć
  9. if($module == 'default') {
  10. return;
  11. }
  12.  
  13. // ścieżka do pliku Bootstrap
  14. $path = APPLICATION_PATH . '/modules/' . $module . '/Bootstrap.php';
  15.  
  16. // nazwa klasy Bootstrap
  17. $class = ucfirst($module) . '_Bootstrap';
  18.  
  19. // inicjalizacja, załadowanie i utworzenia obiektu klasy Bootstrap modułu
  20.  
  21. /*$application = new Zend_Application(
  22.   APPLICATION_ENV,
  23.   APPLICATION_PATH . '/modules/' . $module . '/configs/module.ini'
  24.   );*/
  25. //zakomentowałem to, bo mam tylko 1 plik konfiguracyjny dla każdego modułu
  26.  
  27. Zend_Loader::loadFile('Bootstrap.php', dirname($path));
  28. $bootstrap = new $class($application);
  29. $bootstrap->bootstrap();
  30. }
  31. }
2. W głównym Boostrapie dodałem:
  1. protected function _initModules()
  2. {
  3. }
  4.  
  5. protected function _initPlugins()
  6. {
  7. $this->bootstrap('frontController');
  8. $front = $this->getResource('frontController');
  9. $front->registerPlugin(new Plugins_ModuleLoader());
  10. }


Odpalam moduł, a tutaj informacja, że nie znajduje mi klasy 'Plugins_ModuleLoader' .



P.S. Czy to nie koliduje ze skryptem, który wczytuje mi automatycznie layouty? Taka jest jego zawartość:
  1. class Amz_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract
  2. {
  3.  
  4. public function preDispatch()
  5. {
  6. $bootstrap = $this->getActionController()
  7. ->getInvokeArg('bootstrap');
  8. $config = $bootstrap->getOptions();
  9. $module = $this->getRequest()->getModuleName();
  10. if (isset($config[$module]['resources']['layout']['layout'])) {
  11. $layoutScript = $config[$module]['resources']['layout']['layout'];
  12. $this->getActionController()
  13. ->getHelper('layout')
  14. ->setLayout($layoutScript);
  15. }
  16. }
  17.  
  18. }
A w głównym Boostrapie jest wywoływany:
  1. protected function _initLayoutHelper()
  2. {
  3. $this->bootstrap('frontController');
  4. $layout = Zend_Controller_Action_HelperBroker::addHelper(new Amz_Controller_Action_Helper_LayoutLoader());
  5. }
batman
W chwili obecnej nie mam jak tego przetestować, więc dopiero wieczorem będę mógł pogrzebać w kodzie. Na szybkiego to wygląda na to, że nie zarejestrowałeś przestrzeni nazw Plugin:
  1. autoloaderNamespaces.Plugin = "Plugin_"
IceManSpy
Dodałem do application.ini tego namespace'a (u mnie akurat musi być Plugins_ wink.gif ). Odpaliło się, ale:
1. Menu nadal jest nie wczytywane (teraz w ogóle się nie wczytuje)
2. Wczytywany jest defaultowy layout, a w jago content'cie jest wczytywany cały layout modułu.
3. Wyskakuje błąd z boostrapem w modułach:
  1. An error occurred
  2. Application error
  3. Exception information:
  4.  
  5. Message: Invalid application provided to bootstrap constructor (received "Zend_Application_Bootstrap_BootstrapAbstract" instance)
  6. Stack trace:
  7.  
  8. #0 F:\xampp\htdocs\komunikator\library\Zend\Application\Module\Bootstrap.php(56): Zend_Application_Bootstrap_BootstrapAbstract->setApplication(NULL)
  9. #1 F:\xampp\htdocs\komunikator\library\Plugins\ModuleLoader.php(27): Zend_Application_Module_Bootstrap->__construct(NULL)
  10. #2 F:\xampp\htdocs\komunikator\library\Zend\Controller\Plugin\Broker.php(287): Plugins_ModuleLoader->dispatchLoopStartup(Object(Zend_Controller_Request_Http))
  11. #3 F:\xampp\htdocs\komunikator\library\Zend\Controller\Front.php(928): Zend_Controller_Plugin_Broker->dispatchLoopStartup(Object(Zend_Controller_Request_Http))
  12. #4 F:\xampp\htdocs\komunikator\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
  13. #5 F:\xampp\htdocs\komunikator\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
  14. #6 F:\xampp\htdocs\komunikator\public\index.php(26): Zend_Application->run()
  15. #7 {main}
  16.  
  17. Request Parameters:
  18.  
  19. 'module' => 'student',
  20. 'controller' => 'index',
  21. 'action' => 'index',
  22. )



Znalazłem jeszcze jedno rozwiązanie, które działa smile.gif
http://forums.zend.com/viewtopic.php?f=69&t=1589#p6165
Kwestia przerobienia tylko, aby nie wczytywał plików xml, a php.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.