Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework] paginacja - problem z domyślną stroną
csharp
post 20.09.2012, 00:11:26
Post #1





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


mam problem tego typu, że paginacja działa mi poprawnie dopiero jeśli dopiszę ręcznie w pasku nr strony np. 1 - później już normalnie przeskakuje.

problem nie występuje gdy otwieram stronę z kontrolera tj. public/index/index wtedy ładnie przeskakuje index/index/page/2 -> page/3 itd

chciałem sobie ułatwić i ustawić aby zmienna page wczytywała się już w public np. public/2

paginacja wygląda standardowo jak poniżej:

  1. $result = $Post->fetchAll($select);
  2.  
  3. $pageNumber = 1;
  4. $itemNumber = 1;
  5. $paginator = Zend_Paginator::factory($result);
  6. $paginator->setItemCountPerPage($pageNumber);
  7. $paginator->getItemsByPage($itemNumber);
  8. $paginator->setCurrentPageNumber($this->_getParam('page', 1));
  9. Zend_Paginator::setDefaultScrollingStyle('Sliding');
  10. $view = new Zend_View();
  11. $paginator->setView($view);
  12.  
  13. $this->view->result = $paginator;
  14. $this->view->paginator = $paginator;


i w application.ini poczyniłem coś takiego:

  1. resources.router.routes.page.route = "/:page"
  2. resources.router.routes.page.defaults.controller = "index"
  3. resources.router.routes.page.defaults.action = "index"
  4. resources.router.routes.page.defaults.page = "1"


ma ktoś jakiś pomysł?

Ten post edytował csharp 20.09.2012, 00:13:40


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
darko
post 20.09.2012, 00:58:24
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Jednym ze sposobów może być sprawdzenie:
  1. $p = $this->_getParam('page');
  2. if(!is_null($p) && isset($p)) // najlepiej ustaw breakpoint na tej linii i sprawdź co jest w zmiennej $p
  3. {
  4. $paginator->setCurrentPageNumber($this->_getParam('page', 1));
  5. }
  6. else
  7. {
  8. $paginator->setCurrentPageNumber(1);
  9. }


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
csharp
post 20.09.2012, 22:51:43
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


dziwne... wrzuciłem to w kontroler i nic ;/ $p jest po prostu pusta... oczywiście jak dopisze ręcznie w adresie 1 lub 2 to wszystko dalej śmiga...


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
Pilsener
post 21.09.2012, 00:17:44
Post #4





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

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


1. Pokaż nam, jakich używasz adresów, jak one wyglądają, nazwę domeny możesz ukryć/zmienić wink.gif
2. Czy używasz modułów?
3. ZF w wersji 2.0 czy niższej?
4. Nos mi podpowiada że to problem z tworzeniem adresów w widoku paginatora, więc jak możesz to wklej fragment kodu, jak tworzysz te linki
Go to the top of the page
+Quote Post
darko
post 21.09.2012, 12:27:20
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Skoro tak, to spróbuj:
  1. $p = @$this->_getParam('page');
  2. if(!is_null($p) || isset($p) || $p == '')


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Psajkus
post 21.09.2012, 12:32:31
Post #6





Grupa: Zarejestrowani
Postów: 45
Pomógł: 5
Dołączył: 26.06.2011

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


parametry pobiera sie tak:

  1. $page = $this->_getParam('page','domyslna_wartosc');
  2.  
  3. //czyli w Twoim przypadku:
  4. $page = $this->_getParam('page',1);


nie cudujcie z ifami;
Go to the top of the page
+Quote Post
csharp
post 21.09.2012, 13:21:18
Post #7





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


kurde chyba jest coś skopane... ani jedno ani drugie mi nie działa... ze zmienną $p i tymi ifami też nic..

@Psajkus ja tak pobierałem parametr wcześniej.

zobaczcie raz jeszcze:

1. adresy, które uzywam wyglądają tak:

nazwadomeny.pl/jakies-artykul.html -> ale to akurat nie ma na ten problem chyba żadnego wpływu...

  1. resources.router.routes.post_show.type = "Zend_Controller_Router_Route_Regex"
  2. resources.router.routes.post_show.route = "([a-zA-Z0-9\-_]+)\.html"
  3. resources.router.routes.post_show.defaults.controller = "index"
  4. resources.router.routes.post_show.defaults.action = "showpost"
  5. resources.router.routes.post_show.reverse = "%s.html"
  6. resources.router.routes.post_show.map.1 = "address"


strona główna to po prostu nazwadomeny.pl (tutaj wyświetla sie pierwsza strona z postami)

i teraz, chce aby strony z postami były wyświetlane w nastepujący sposób:

nazwadomeny.pl/1 -> pierwsza (domyślna!) strona
nazwadomeny.pl/2 -> druga strona itd...

posty dzielone są tak w public function init()

  1. $pageNumber = 1;
  2. $itemNumber = 1;
  3. $paginator = Zend_Paginator::factory($result);
  4. $paginator->setItemCountPerPage($pageNumber);
  5. $paginator->getItemsByPage($itemNumber);
  6. $paginator->setCurrentPageNumber($this->_getParam('page', 1));
  7. Zend_Paginator::setDefaultScrollingStyle('Sliding');
  8. $view = new Zend_View();
  9. $paginator->setView($view);
  10.  
  11. $p = $this->_getParam('page');
  12.  
  13. $this->view->result = $paginator;
  14. $this->view->paginator = $paginator;


i w zasadzie wszystko pieknie działa
wpisując nazwadomeny.pl/3 wyświetla mi się 3 strona tak jak chce.

ale nie działa mi nawigacja tych stron jeśli jestem na stronie nazwadomeny.pl, nie mogę przejść do drugiej strony wykorzystując j/n kod:

  1. <?php echo $this->paginationControl($this->paginator,
  2. 'Sliding','my_pagination_control.phtml'); ?>


jeszcze rzut na linki w my_pagination_control.phtml

  1. <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>


nic więcej nie używam do tego, nie mu tu modułów, wszystko opiera się na kontrolerze index, application.ini i widoku.

rzut jeszcze na application.ini:

  1. resources.router.routes.page.route = "/:page"
  2. resources.router.routes.page.defaults.controller = "index"
  3. resources.router.routes.page.defaults.action = "index"
  4. resources.router.routes.page.defaults.page = "1"


ZF poniżej 2.0

jedyny problem to taki, że przy pierwszej domyslnej stronie nie jest przesyłany parametr w linku np. "next"


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
darko
post 21.09.2012, 16:47:53
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Nie wiem dokładnie, jak ten Twój router działa, w każdym razie adres:
nazwadomeny.pl/3
to nie to samo, co
nazwadomeny.pl/page/3


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
csharp
post 22.09.2012, 01:01:08
Post #9





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


No to w takim razie jak działa, skoro to działa biggrin.gif ? problem jest tylko z domyslnym adresem..


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
darko
post 22.09.2012, 11:26:57
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Spróbuj z ustawieniem domyślnej wartości parametru w routerze.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
csharp
post 25.09.2012, 09:44:09
Post #11





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


ale to w bootstrapie się powinno gdzieś dać?

zacząłem kombinować jakoś tak:

  1. protected function _initPostPage()
  2. {
  3. $this->bootstrap('router');
  4. $router = $this->getResource('router');
  5. $route = new Zend_Controller_Router_Route(
  6. '/post/:page',
  7. array('page' => 1)
  8. );
  9. $router->addRoute('page', $route);
  10. }
  11.  


no ale nie ma to żadnego wpływu..

kombinowałem, że może łatwiej będzie jak zacznę w taki sposób wyświetlać strony: nazwadomeny.pl/post/5 -> 5 strona

i w zasadzie jak przejdę do nazwadomeny.pl/post to wyświetla się domyślnie 1 strona i nawigacja paginatora działa bez zarzutu

zastanawiam się czy nie da się w tej nawigacji paginatora ustawić jakoś na sztywno tych adresów aby załapywało od razu, bo gdy jestem w nazwadomeny.pl to href="" w linku jest po prostu pusty.. jak przejdę ręcznie do 5 strony to bez problemu linki dizałają.

//edit: chłopaki - macie jakieś pomysły jeszcze?


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
CuteOne
post 25.09.2012, 10:54:56
Post #12





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

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


Sprawdź
  1. $this->bootstrap('router');
  2. $router = $this->getResource('router');
  3. $route = new Zend_Controller_Router_Route(
  4. '/post/:page',
  5. array('controller'=>'moj_controller', 'action'=>'moja_akcja', 'page' => 1),
  6. array('page'=>'[0-9]{1,}')//regex
  7. );
  8. $router->addRoute('page', $route);
Go to the top of the page
+Quote Post
csharp
post 25.09.2012, 13:16:04
Post #13





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


dzięki mistrzu - działa smile.gif

ale.. po drobnej przeróbce...

musiałem wywalic nazwę podkatalogu... nie chciało mi to nadal działać jak było: '/post/:page'

zostawiłem samo ':page' i normalnie śmiga i przekakuje na nazwadomeny.pl/2

macie jakis pomysł od czego to może zależeć?


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
Pilsener
post 25.09.2012, 20:13:35
Post #14





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

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


Pewnie jest konflikt ze standardowymi routingami Zenda, które pewnie można wyłączyć czy nadpisać ale ja nigdy tego nie robiłem, bo wg mojej filozofii defaultowe routingi muszą działać dla potrzeb developerskich, jak wpiszę kontroler/akcja/page/1/kategoria/345 to ma to działać i już. Tak samo u Ciebie jakbyś tak wpisał to na 99% by działało i od razu wiesz, że masz problem z routingiem a nie np. z kontrolerem czy dispatcherem.

Każdy adres typu .pl/costam/ktostam będzie traktowany jako kontroler/akcja, dlatego radzę unikać podobnej do defaultowej nomenklatury w swoich routingach i bawić się w to dopiero na końcu bo potem okazuje się, że i tak trzeba je kilka razy przerabiać.

Najlepiej od razu przemyśleć całą koncepcję adresów i zawrzeć ją w konfiguracji, tak, żeby łatwo można było przełączyć się na wersję standardową.
Go to the top of the page
+Quote Post
csharp
post 25.09.2012, 21:41:32
Post #15





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

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


no dobra... ale ja aplikacje dopiero tworzę... w takim razie co mogę zmienić aby to działało jak powinno? co mogę pokazać?

jeśli chodzi o routingi to mam tak:

  1. resources.router.routes.homepage.route = "/"
  2. resources.router.routes.homepage.controller = "index"
  3. resources.router.routes.homepage.action = "index"
  4.  
  5. resources.router.routes.domowa.route = "/"
  6. resources.router.routes.domowa.defaults.controller = "index"
  7. resources.router.routes.domowa.defaults.action = "index"


masę podstron o takim przekierowaniu:
  1. resources.router.routes.news.route = "newsletter"
  2. resources.router.routes.news.defaults.controller = "index"
  3. resources.router.routes.news.defaults.action = "newsletter"


i jednen o takim - który na podstawie adresu z bazy przekierowuje na przyjazny adres:

  1. resources.router.routes.post.type = "Zend_Controller_Router_Route_Regex"
  2. resources.router.routes.post.route = "([a-zA-Z0-9\-_]+)\.html"
  3. resources.router.routes.post.defaults.controller = "index"
  4. resources.router.routes.post.defaults.action = "nazwa-posta"
  5. resources.router.routes.post.reverse = "%s.html"
  6. resources.router.routes.post.map.1 = "adres"


i w zasadzie to wszystko... co z tego może rozwalać mi moją koncepcje?


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
Pilsener
post 26.09.2012, 22:40:51
Post #16





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

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


Tam gdzie używasz .html wygląda ok, ale ja zalecam dokleić do adresu także ID - jest szybciej i mniej kłopotliwie, dla SEO to żadna różnica jeśli doklejasz ID na końcu adresu a i na potrzeby developerskie sprawdza się dużo lepiej, nie muszę się zastanawiać, jaki jest ID artykułu w którym coś nie bangla.

Kod
    resources.router.routes.news.route = "newsletter"
    resources.router.routes.news.defaults.controller = "index"
    resources.router.routes.news.defaults.action = "newsletter"
- ten też wygląda ok, ale jeśli mamy dużo "sztywnych" adresów to warto je obsłużyć jednym routingiem żeby nie mnożyć sztywnych deklaracji routingów bez potrzeby, można też wrzucić listę stron "stałych" do modelu a routing tego typu definiować w bootstrapie - łatwiejsza jest wtedy modyfikacja i implementacja, możesz sobie sprawdzać, czy do obsłużenia np. reguły "newsletter" istnieje specjalna akcja i ją wywołać a jeśli nie, to renderować tylko widok o takiej nazwie a jeśli i jego nie ma, to wyjątek -> strona błędu.


Kod
resources.router.routes.homepage.route = "/"
resources.router.routes.homepage.controller = "index"
resources.router.routes.homepage.action = "index"

resources.router.routes.domowa.route = "/"
resources.router.routes.domowa.defaults.controller = "index"
resources.router.routes.domowa.defaults.action = "index"
- te routingi nie wiem za bardzo co mają robić, przecież strona główna to kontroler index i akcja index, jest to także domyślny routing (czyli jak nie znajdzie żadnego dopasowania to żądanie zostanie obsłużone właśnie przez tą akcję) a by wygenerować adres strony głównej nie potrzebujemy chyba routingu ani tym bardziej kilku?


Powiem tak, jeśli używasz routingów na modłę Zendową, to używaj jakiegoś klucza, np:

Kod
resources.router.routes.artykuly.route = ":title/:id"
- źle

Kod
resources.router.routes.artykuly.route = "artykuly/:title/:id"
- dobrze

Inaczej są problemy, istotna staje się kolejność routingów i tak dalej a przede wszystkim ktoś kto siądzie potem do tego kodu będzie miał problem.

I pamiętaj, że jak używasz this->url to korzysta on nie tylko z przekazywanych parametrów, ale także tych w GET - można to którymś parametrem wyłączyć (chyba trzecim, bo drugi to nazwa routingu)
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 Wersja Lo-Fi Aktualny czas: 16.04.2024 - 05:11