Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Paginacja i routing
Forum PHP.pl > Forum > PHP > Frameworki
PiotrekM
Witam,
zrobiłem paginację dla postów, które wyświetlane są na stronie głównej. Problem polega na tym, że adres do stron paginacji jest następujący ./index/index/page/2 - chciałbym zamiast tego wyświetlać po prostu ./strona/2
niby osiągnąłem to co chciałem, ale nie do końca.

w application.ini dałem:
Kod
resources.router.routes.default.route = "strona/:page"
resources.router.routes.default.defaults.controller = index
resources.router.routes.default.defaults.action = index
resources.router.routes.default.defaults.page = 1

teraz paginacja działa ok, ale link do strony głównej zmienił się na: ./strona
a adres do postów są następujące: ./strona/slug

domyślam się, że ma to związek z domyślnym routingiem - ale jak to ustawić, żeby działało i nie kolidowało ze sobą?
dzięki wielkie smile.gif
pawv
W taki sposób generuj linki, które korzystają z defaultowego routingu, drugi parametr w tym przypadku wskazuje na podstawowy routing

  1. <?= $this->url(array(),'default',true); ?>
PiotrekM
zrobiłem w sumie odwrotnie, w paginacji dałem 0
  1. <?= $this->url(array(),'pagina',true); ?>

ale czy nie da się zrobić tego bez ingerencji w generowanie urli?
Pilsener
Jestem pewny na 90%, że jeśli nie poda się w helperze url drugiego parametru (oznaczającego nazwę routingu) to powinien on być dziedziczony z default albo z tego, który jest używany na bieżącej stronie. Sprawdź czy nie ma gdzieś tam metody ->setDefaultRoute czy czegoś w tym rodzaju. Bo zmieniać w każdym widoku podpiętym pod dany kontroler URLe średnio się widzi.
KrzysiekWildfire
Jest używany pierwszy routing który pasuje do schematu (a więc aktywny).

Nie polecam definiowania routingu w pliku ini, można to zrobić na 2 inne sposoby.

1. w bootstrap.php
Moim zdaniem najlepsze miejsce na zdefiniowanie routingu (jeżeli nie jest trzymany w bazie lub plikach zewnętrznych).

Tworzymy coś takiego:

  1. public function _initRouter(){
  2. $routes['news'] = new Zend_Controller_Router_Route( //tworzymy nowy route
  3. '@news', //podajemy jaką ścieżkę ma mieć route, znak @ oznacza, że fraza news ma zostać przetłumaczona przy pomocy Zend_Translate - tylko, że wcześniej w bootstrapie trzeba umieścić w Zend registry instancję Zend_Translate jako klucz podając 'Zend_Translate'. Jeżeli nie używasz translacji, to musisz wywalić znak małpy i zostawić samo 'news' bo będzie sypało błędami
  4. 'module'=>'default', //definiujemy do jakiego modułu ma prowadzić route
  5. 'controller'=>'index', //jakiego kontrolera
  6. 'action'=>'news' //i do jakiej akcji
  7. )
  8. );
  9. $routes['news_read'] = new Zend_Controller_Router_Route(
  10. '@news/:title/:id/', //po dwukropku podajemy nazwy zmiennych które mają być przekazane do aplikacji (do odczytanie w $this->_request->getParam('zmienna');
  11. 'module'=>'default',
  12. 'controller'=>'index',
  13. 'action'=>'news',
  14. 'title'=>null //tutaj musimy zdefiniować standardową wartość, proponuję null, bo jest to zgodne z prawdą gdy się nic nie przekaże
  15. 'id'=>null //tak samo jak wyżej
  16. )
  17. );
  18. $router = Zend_Controller_Front::getInstance()->getRouter(); // tutaj wyciągamy router
  19. $router->addRoutes($routes); //i wsadzamy do niego nowe routy
  20. } //i gotowe


Ten sposób (moim zdaniem) jest najlepszy, w szczególności gdy mamy aplikacje która posiada jakieś dodatkowe moduły, wtedy możemy definiować ścieżki do danego modułu w jego własnym bootstrap.php.

Drugim sposobem jest umieszczenie powyższego kodu w pluginie, tylko trzeba pamiętać, aby zdefiniować routing w routeStartup() bo aplikacja nie będzie wiedziała o routingach podczas sprawdzania ścieżek, i będą się działy cuda na kiju, bo routing nie będzie sobie zdawał sprawy z istnienia dodatkowych scieżek, i nie będzie wiedział jak je przepisać, ale widok już będzie miał te informacje i ścieżki będzie dobrzy wysyłał.

A propos ścieżki do katalogu domowego, to ja ją definiuję tak:

  1. public function _initRouter(){
  2. $routes['home'] = new Zend_Controller_Router_Route(
  3. '/',
  4. 'module'=>'default',
  5. 'controller'=>'index',
  6. 'action'=>'index'
  7. )
  8. );
  9. $router = Zend_Controller_Front::getInstance()->getRouter();
  10. $router->addRoutes($routes);
  11. }


i jeszcze bardzo fajna rzecz: Zend_Route, Zend_Translate, Zend_Acl, Zend_Auth, Zend_Navigation - bardzo dobrze ze sobą współpracują: Acl ustawia przywileje użytkownikowi który zalogował się przez Auth, jednocześnie Zend_Route sprawdza przy użyciu zend Acl czy użytkownik może korzystać z danego zasobu i przekazuje tą informację do Zend_Navigation, tak, że użytkownik nie zobaczy odnośników do których nie ma dostępu.
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.