Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework] Paginacja i routing
PiotrekM
post
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
pawv
post
Post #2





Grupa: Zarejestrowani
Postów: 25
Pomógł: 5
Dołączył: 9.02.2011
Skąd: warszawa

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


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); ?>
Go to the top of the page
+Quote Post
PiotrekM
post
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


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?
Go to the top of the page
+Quote Post
Pilsener
post
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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.
Go to the top of the page
+Quote Post
KrzysiekWildfire
post
Post #5





Grupa: Zarejestrowani
Postów: 93
Pomógł: 11
Dołączył: 27.10.2010
Skąd: Kutno/Poznań

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


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.

Ten post edytował KrzysiekWildfire 12.03.2012, 19:22:29
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 21:00