Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] ko3, routing
Forum PHP.pl > Forum > PHP > Frameworki
nmts
Wymyśliłem sobie takie urle:

Cytat
fafafa,6/price_from=0/price_to=100/sort=id/order=asc/


A więc routing mam ustawiony tak:

  1. /* Lista aukcji */
  2. Route::set('auctions_list', '<category_title>,<category_id>(/price_from=<price_from>)(/price_to=<price_to>)(/buy_now=<buy_now>)(/quantity_left=<quantity_left>)(/sort=<sort>/order=<order>)(/remove=<remove>)(,<page>)', array('page' => '\d+', 'category_id' => '\d+'))
  3. ->defaults(array(
  4. 'controller' => 'auctions',
  5. 'action' => 'index',
  6. ));


Tylko, że nie działa to tak jakbym chciał. Gdy robię link na podstawie routingu to chcę czasem przekazać tylko część parametrów, tymczasem robiąc link za pomocą powyższego generuje:

Cytat
fafafa,6/price_from=0/buy_now=/quantity_left=/sort=id/order=asc



Rozumiem czemu się tak dzieje, ale czy jest rozwiązanie żeby pomijało takie nawiasy? Chyba pozostaje przekazywanie odpowiednich zmiennych i później przy odczycie rozbijanie co nie? wink.gif
thek
Podobny problem był w serwisie, którym zajmuje się kumpel biurko obok. Ostatecznie zrobił to tak:
  1. Route::set('objects', 'obiekty(/<slug>(/<page>))', array('slug' => '.*', 'page' => '[0-9]+'))
  2. ->defaults(array(
  3. 'controller' => 'obiekty',
  4. 'action' => 'index'
  5. ));
i mamy przykładowy url:
http://www.domena.pl/obiekty/miasto_Kraków...max_2/miejsc_14
I teraz tylko klasa statyczna z funkcją:
  1. static public function parse_url($url)
  2. {
  3. $url = explode('/', $url);
  4. $return = array();
  5. foreach($url as $k => $v)
  6. {
  7. if($k == (count($url) - 1) AND is_numeric($v))
  8. {
  9. $return['page'] = $v;
  10. continue;
  11. }
  12. if( ! utf8::stristr($v, '_'))
  13. continue;
  14. $param = explode('_', $v);
  15. $return[$param[0]] = utf8::stristr($param[1], ',') ? explode(',', $param[1]) : $param[1];
  16. }
  17. return $return;
  18. }


W tym momencie nawet kolejność podawania elementów w url nie ma znaczenia. I tak masz w wyniku tablicę asocjacyjną. Jedynie musisz uważać na SEO i duplicate contents. Ale od tego masz już canonical url i inne tego typu zabawki jak choćby zdefioniowanie priorytetu parametrów i według tego potem generowanie url.
Fifi209
Nie wygląda to nijak na przyjazne url'e. Wersja thek'a już jest o wiele lepsza.
thek
Byłbym zapomniał... Oczywiście parse_url wywołujesz w kontrolerze na który kieruje Route, czyli w tym wypadku wewnątrz obiekty.

@Fifi... Ale idea ta sama. Jedyna różnica to fakt jakiego użyto separatora. Underscore zamiast znaku równości jest przyjaźniejszy, ale to tylko tak naprawdę różnica estetyczna. To na co trzeba zwracać uwagę to fakt, by się w nazwie parametru nie pojawił _ i stąd użycie - do parametrów wielowyrazowych. Inaczej parse_url źle podzieli bloczek na key i value do dalszej obróbki. Można by użyć explode z 3 parametrami, ale nigdy byś nie wiedział do konca czy to key czy value było wielowyrazowe. Dlatego nazewnicto parametrów leży w gestii programisty i to on musi o to zadbać. W takim wypadku modyfikacja mogła by wyglądać tak, że explode wymuszałby zawsze 2-elementową tablicę. Nieważne czy value miało by czy nie jakieś _ w sobie.
nmts
Generalnie zjebałem sprawę. Bo wydawało mi się, że to metoda uri() z klasy Route zwraca taki url, a to param() z Requesta zwracał tablicę z pustymi wartościami. Wobec tej ośmieszającej pomyłki metoda thek'a nie ma dla mnie sensu, bo wystarczy $this->request->param(), usunięcie z tablicy co nie potrzebne i wtedy przekazanie tego do uri() co jest wygodniejsze. Tak czy inaczej dzięki za pomoc i sorry za zaczęcie tematu bez lepszego sprawdzania co i jak. wink.gif A co do przyjazności url - to nie jest temat na temat przyjazności url. wink.gif
thek
Tak jeszcze jedno nmts... Ja to na Twoim miejscu bym
  1. array('page' => '\d+', 'category_id' => '\d+')
pozmieniał i ujął wszystkie parametry w regexp-ach. Prościej i szybciej opanować sytuację, gdy Ci się wywala strona już na etapie routingu niż potem już w kontrolerze, gdzie najczęściej ruszyło wiele obiektów do pracy, które niepotrzebnie to zrobiły, bo i tak się strona wywala wink.gif Poza tym zobacz jak sobie roboty narobiłeś z metodami teraz.
nmts
Cytat(thek @ 8.07.2011, 13:40:35 ) *
Poza tym zobacz jak sobie roboty narobiłeś z metodami teraz.


Racja, zdefiniuje wzorzec dla wszystkich parametrów, rozumiem korzyść, ale roboty sobie nie narobiłem. tongue.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.