Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Zend_Controller_Router_... do przetworzenia zmiennej GET
Forum PHP.pl > Forum > PHP > Frameworki
MattY
Witam

Zaczynam i próbuję coś sobie pisać w ZF, mam kawałek aplikacji, w której dostęp do galerii następuje poprzez kliknięcie linków z #hashem - jQuery.
Aby strony galerii mogły być zaindeksowane przez googlebota potrzebne jest stworzenie statycznego kontrolera do ich wyświetlania. Linki w formacie base/#!gallery-1-13 stają się dla bota base/?_escaped_fragment_=gallery-1-13 - https://developers.google.com/webmasters/aj...tarted?hl=pl-PL

No i tu moje pytanie jak napisać regułę Routera która spowoduje wywołanie odpowiedniego kontrolera i akcji, czyli w moim przypadku:
Kod
?_escaped_fragment_=gallery-(\d+)-(\d+)

controller: gallery
action: foto
param1: 1
param2: 2

Proszę o wskazówki. Szukałem pod hasłami zend router GET ale ciężko coś znaleźć bo w angielskim mamy GET i get niestety tongue.gif

up
irmidjusz
Kolego, nie wiem, czy aby na pewno rozumiem o co Ci chodzi z tym routingiem, ale jeśli chcesz, aby adres:

www.mojastrona.pl/?_escaped_fragment_=gallery-1-13

był rozpoznawany jako wywołanie takie, jak przy standardowym routingu: /gallery/foto/param1/1/param2/13,
to można to zrobić w taki sposób:

w folderze library/App/Controller/Router/Route utwórz plik Googlebot.php i umieść w nim kod:

  1. /**
  2.  * Rozpoznaje urle googlebota do indeksowania stron ajaxowych.
  3.  */
  4. class App_Controller_Router_Route_Googlebot extends Zend_Controller_Router_Route_Regex
  5. {
  6. /**
  7. * @param Zend_Config $config
  8. * @return App_Controller_Router_Route_Googlebot
  9. */
  10. public static function getInstance(Zend_Config $config)
  11. {
  12. $defs = ($config->defaults instanceof Zend_Config) ? $config->defaults->toArray() : array();
  13. $map = ($config->map instanceof Zend_Config) ? $config->map->toArray() : array();
  14. $reverse = (isset($config->reverse)) ? $config->reverse : null;
  15. return new self($config->route, $defs, $map, $reverse);
  16. }
  17.  
  18. /**
  19. * @see Zend_Controller_Router_Route_Regex::match()
  20. * @param Zend_Controller_Request_Abstract $request
  21. * @return array|false
  22. */
  23. public function match($request)
  24. {
  25. if (!$request instanceof Zend_Controller_Request_Abstract) {
  26. return false;
  27. }
  28.  
  29. $path = $request->getParam('_escaped_fragment_');
  30. if (empty($path)) {
  31. return false;
  32. }
  33.  
  34. return parent::match($path);
  35. }
  36.  
  37. /**
  38. * @see Zend_Controller_Router_Route_Regex::getVersion()
  39. * @return integer
  40. */
  41. public function getVersion()
  42. {
  43. //musi być zwracane 2 aby do metody match() jako parametr przekazywało obiekt request
  44. return 2;
  45. }
  46. }


następnie do pliku konfiguracyjnego (standardowo application/configs/application.ini) dodaj:

Kod
resources.router.routes.foto.type = "App_Controller_Router_Route_Googlebot"
resources.router.routes.foto.route = "gallery-(\d+)-(\d+)"
resources.router.routes.foto.defaults.controller = "gallery"
resources.router.routes.foto.defaults.action = "foto"
resources.router.routes.foto.map.1 = "param1"
resources.router.routes.foto.map.2 = "param2"


Żeby ładowało automatycznie klasę App_Controller_Router_Route_Googlebot, dodaj też:

Kod
autoloadernamespaces[] = "App"


W każdym razie u mnie działa (sprawdziłem na szybko na projekcie, który mam na warsztacie), więc u Ciebie też powinno wink.gif
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.