Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework]Zend_Navigation + Zend_Router aktywny link, Serdecznie proszę o pomoc
R4D3K
post
Post #1





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
batman
post
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




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.


--------------------
I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 10:52