Clicky

Skocz do zawartości


Zdjęcie
- - - - -

Routing i wersje językowe

10 odpowiedzi w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 Pitu

Pitu

    Początkujący

  • Użytkownik
  • Pip
  • 55 postów
  • Skąd:Koszalin

Napisano 07 marzec 2013 - 18:49

Mam problem ze stworzeniem routingu, który będzie prawidłowo rozpoznawał wybrany język.

Mój Route:
Route::set('default', '((<lang>/)(<controller>(/<action>(/<id>))))',
        array(
                'lang'      => ('pl|en'),
                'id'        => '\d+'
  ))
->defaults(array(
                'lang'      => $deflang,
'controller' => 'start',
'action'    => 'index'
));


Niby działa w większości przypadków lecz problem jest przy podaniu tylko lang. Traktuje go jako nazwę kontrolera co oczywiste.
$route = Route::get('default');

$request[] = Request::factory(''); //dziala
$request[] = Request::factory('start'); //dziala
$request[] = Request::factory('start/index'); //dziala
$request[] = Request::factory('pl/start/index'); //dziala
$request[] = Request::factory('pl/'); //nie dziala

Dla ostatniego zwraca:
array(3) ( "lang" => string(2) "pl" "controller" => string(2) "Pl" "action" => string(5) "index" )

Czy da się jakoś łatwo zrobić aby string pasujący do warunku lang nie traktowało jako nazwę kontrolera?

#2 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 07 marzec 2013 - 21:31

Mistrzem routingow nie jestem, ale usun niepotrzebne nawiasy
((<lang>/)(<controller>(/<action>(/<id>))))
na
(<lang>/(<controller>(/<action>(/<id>))))

#3 Pitu

Pitu

    Początkujący

  • Użytkownik
  • Pip
  • 55 postów
  • Skąd:Koszalin

Napisano 07 marzec 2013 - 21:58

Zmieniając na taki route, dostaję zwroty dla powyższych adresów:
array(3) ( "lang" => string(2) "pl" "controller" => string(5) "Start" "action" => string(5) "index" )
bool FALSE
bool FALSE
array(3) ( "lang" => string(2) "pl" "controller" => string(5) "Start" "action" => string(5) "index" )
bool FALSE


#4 Maciek

Maciek

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 780 postów

Napisano 07 marzec 2013 - 22:17

Akurat nie te nawiasy są nadmiarowe.

Polecam zajrzeć tu - powinno pomóc.

#5 Pitu

Pitu

    Początkujący

  • Użytkownik
  • Pip
  • 55 postów
  • Skąd:Koszalin

Napisano 08 marzec 2013 - 00:53

Niestety po zastosowaniu:
(<lang>/)(<controller>)(/<action>(/<id>))

Nie działa adres:
http://domena.pl/pl

array(3) ( "lang" => string(2) "pl" "controller" => string(2) "Pl" "action" => string(5) "index" )


pl odczytuje nie jako parametr lang tylko controller.

#6 Maciek

Maciek

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 780 postów

Napisano 08 marzec 2013 - 09:57

Takiego przykładu nie podałeś w swoim pierwszym poście i to oczywiste, że nie działa - podany routing spodziewa się znaku '/' na końcu, czyli http://domena.pl/pl/.

Jeśli to dla Ciebie problem to zdefiniuj (wcześniej) dodatkowy routing tylko na samego lang w adresie (bez '/' na końcu) i tam ustawiaj te same domyślne wartości kontrolera i akcji.

Możesz też użyć Lambdy ale to już IMHO będzie trochę przekombinowane w Twoim przypadku.

#7 lukaskolista

lukaskolista

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 414 postów

Napisano 08 marzec 2013 - 10:13

(<lang>(/<controller>(/<action>(/<id>))))

#8 Maciek

Maciek

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 780 postów

Napisano 08 marzec 2013 - 11:16

(<lang>(/<controller>(/<action>(/<id>))))

To chyba nie ma prawa działać dla przypadku z kontrolerem i resztą ale bez języka na początku ...

#9 Pitu

Pitu

    Początkujący

  • Użytkownik
  • Pip
  • 55 postów
  • Skąd:Koszalin

Napisano 08 marzec 2013 - 13:59

Nawet z podanym znakiem '/' na końcu nie działało. Stworzyłem osobny routing tak jak poleciłeś i jest OK.

#10 Maciek

Maciek

    Senior Mastah

  • Użytkownik
  • PipPipPip
  • 780 postów

Napisano 08 marzec 2013 - 14:19

Trochę dziwne, że nie zadziałało z '/' na końcu. Postaram się to sprawdzić przy najbliższej okazji.

Cieszę się, że mogłem pomóc.

#11 Pitu

Pitu

    Początkujący

  • Użytkownik
  • Pip
  • 55 postów
  • Skąd:Koszalin

Napisano 08 marzec 2013 - 14:31

Dla potwierdzenia:
Route::set('default', '(<lang>/)(<controller>)(/<action>(/<id>))',


$route = Route::get('default');

$req = Request::factory('pl/');

echo Debug::dump($route->matches($req))




zwraca:
array(3) ( "lang" => string(2) "pl" "controller" => string(2) "Pl" "action" => string(5) "index" )


lang "pl" to wartość z Cookie, wartość z adresu rozpoznaje jako nazwę kontrolera.





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych