Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Zend_Navigation + Zend_Router aktywny link
Forum PHP.pl > Forum > PHP > Frameworki
R4D3K
Witam wszystkich !
Jestem w trakcie tworzenia aplikacji w Zendzie i napotkałem się na wkurzający problem (ZF 1.11.1). Otóż chcę zrobić aktywny link, czyli gdy podświetlenie jakimś tam stylem danej (aktualnie wybranej) opcji w menu. Problem może być o tyle trudny, że w aplikacji używam Routera i pojawia się po wybraniu opcji start (domyślny router default), to wszystkie linki oznacza jako aktywne.

Plik bootstrap:
  1. <?php
  2. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  3. {
  4. protected function _initViewHelper() {
  5. $this->bootstrap('layout');
  6. $layout = $this->getResource('layout');
  7. $view = $layout->getView();
  8. $view->doctype('XHTML1_STRICT');
  9.  
  10. $configRoute = new Zend_Config_Xml(APPLICATION_PATH . '/configs/route.xml','main');
  11. $router = Zend_Controller_Front::getInstance()->getRouter();
  12. $router->addConfig($configRoute);
  13.  
  14. $configNav = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','main');
  15. $view->navigation(new Zend_Navigation($configNav));
  16. }
  17. }


plik route.xml:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <main>
  4. <oneNews type="Zend_Controller_Router_Route_Regex">
  5. <route>news/(\d+),[a-zA-Z_]+</route>
  6. <defaults controller="news" action="show" />
  7. <map id="1"/>
  8. </oneNews>
  9. <news type="Zend_Controller_Router_Route">
  10. <route>news/:page</route>
  11. <defaults controller="news" action="index" page=""/>
  12. <reqs page="(\d)+" />
  13. </news>
  14. <imprezy type="Zend_Controller_Router_Route">
  15. <route>imprezy/:page</route>
  16. <defaults controller="imprezy" action="index" page=""/>
  17. <reqs page="(\d)+" />
  18. </imprezy>
  19. <kontakt type="Zend_Controller_Router_Route_Static">
  20. <route>kontakt</route>
  21. <defaults controller="index" action="kontakt" />
  22. </kontakt>
  23. <reklama type="Zend_Controller_Router_Route_Static">
  24. <route>reklama</route>
  25. <defaults controller="index" action="reklama" />
  26. </reklama>
  27. <oneGaleria type="Zend_Controller_Router_Route_Regex">
  28. <route>[a-zA-Z_]+/(\d+),(\d){2}.(\d){2}.(\d){4}</route>
  29. <defaults controller="galeria" action="show" />
  30. <map id="1" />
  31. </oneGaleria>
  32. <galeria type="Zend_Controller_Router_Route">
  33. <route>galeria/:page</route>
  34. <defaults controller="galeria" action="index" page=""/>
  35. </galeria>
  36. </main>
  37. </root>


oraz plik navigation.xml :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <root>
  3. <main>
  4. <start>
  5. <label>START</label>
  6. <route>default</route>
  7. </start>
  8. <news>
  9. <label>NEWS</label>
  10. <route>news</route>
  11. </news>
  12. <imprezy>
  13. <label>IMPREZY</label>
  14. <route>imprezy</route>
  15. </imprezy>
  16. <galeria>
  17. <label>GALERIA</label>
  18. <route>galeria</route>
  19. </galeria>
  20. <reklama>
  21. <label>REKLAMA</label>
  22. <route>reklama</route>
  23. </reklama>
  24. <kontakt>
  25. <label>KONTAKT</label>
  26. <route>kontakt</route>
  27. </kontakt>
  28. </main>
  29. </root>


dodatkowo do wyświetlania menu używam Partiala:
  1. <ul>
  2. <?php foreach($this->container as $page):?>
  3. <li><a href="<?=$page->href;?>" title="<?=$page->label;?>" <?=$page->isActive() ? 'class="active"':'';?> ><?=$page->label;?></a></li>
  4. <?php endforeach; ?>
  5. </ul>


I teraz cała zabawa odpalam linka START i otrzymuje taki kod:
  1. <div id="menu"><ul>
  2. <li><a href="/" title="START" class="active">START</a></li>
  3.  
  4. <li><a href="/news" title="NEWS" class="active">NEWS</a></li>
  5. <li><a href="/imprezy" title="IMPREZY" class="active">IMPREZY</a></li>
  6. <li><a href="/galeria" title="GALERIA" class="active">GALERIA</a></li>
  7. <li><a href="/reklama" title="REKLAMA" class="active">REKLAMA</a></li>
  8. <li><a href="/kontakt" title="KONTAKT" class="active">KONTAKT</a></li>
  9. </ul>


Dobra klikam powiedzmy galeria i otrzymuje:
  1. <div id="menu"><ul>
  2. <li><a href="/" title="START" >START</a></li>
  3.  
  4. <li><a href="/news" title="NEWS" >NEWS</a></li>
  5. <li><a href="/imprezy" title="IMPREZY" >IMPREZY</a></li>
  6. <li><a href="/galeria" title="GALERIA" >GALERIA</a></li>
  7. <li><a href="/reklama" title="REKLAMA" >REKLAMA</a></li>
  8. <li><a href="/kontakt" title="KONTAKT" >KONTAKT</a></li>
  9. </ul>
  10.  


Czyli całkiem kosmos ! I mam pytanie czy ktoś pomorze mi wytłumaczyć takie dziwne zachowanie ? Dodam, że link są prawidłowo generowane. Metoda isActive() sorawdza czy wybrana opcja menu jest aktywna, więc co jest nie tak ? blinksmiley.gif
batman
Problemem jest tutaj router. Metoda isActive nie potrafi na podstawie routera określić parametrów requesta, a co za tym idzie poprawnie oznaczyć elementu jako aktywnego. Pewnym rozwiązaniem tego problemu jest zastosowanie w definicji ścieżki opcji params, który wprowadzi kolejny element do sprawdzenia w metodzie isActive. Sposób ten bardzo dobrze się sprawdza w przypadku statycznych routerów. Nie wiem niestety jak sobie poradzi z dynamicznym.
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.