Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie urla
Forum PHP.pl > Forum > PHP
Przem4S
Witam otóż napotkałem na problem z sortowaniem URL'a, u mnie prezentuje się on następująco "/lang/controller/method/arg1/arg2" nic nadzwyczajnego.
Chcę ustawić tak, aby lang był rozpoznawany po ilości liter (strlen) == 2 (chcę używać oznaczeń ISO (pl/de/en itd)) i ma być on opcjonalny, czyli gdy nie wpiszemy
żadnego langa ma ładować domyślny (pl) i 1 argument traktować jako kontroler. W kodzie prezentuje się to tak:

  1. $this->lang=(strlen($l = array_shift($parts))==2) ? $l: $config->get('default_language');
  2. $this->controller=($c = array_shift($parts)) ? $c: $config->get('default_controller');
  3. $this->method=($m = array_shift($parts)) ? $m: $config->get('default_method');
  4. $this->args=(isset($parts[0])) ? $parts : array();


Przy takim kodzie po wprowadzeniu urla "en/controller/method/arg1/arg2" uzyskuję:
  1. Język: en
  2. Kontroler: controller
  3. Metoda: method
  4. array(2) { [0]=> string(4) "arg1" [1]=> string(4) "arg2" }


Przy wprowadzeniu tylko "controller/method/arg1/arg2" uzyskuję:

  1. Język: pl
  2. Kontroler: method
  3. Metoda: arg1
  4. array(1) { [0]=> string(4) "arg2" }


Jak widać ucina mi kontroler z powodu array_shifta (tak się domyślam), co robię źle? Z góry dziękuję za pomoc. Pozdrawiam.
abort
Te testy, które chcesz zrobić, robisz tak:
- Ściągasz element z tablicy. Jak ściągnięty element ma 2 znaki, to to jest język. A jak nie ma? To co z nim robisz? Odpowiedź: zapominasz (masz puste przypisanie w operatorze ternary - zapewne tylko po to, by zachować składnię).

Powinieneś (jedna z dwóch rzeczy):
1. testować $parts[0] na okoliczność wystąpienia dwóch znaków, i jeśli TRUE, to robisz to co robisz
2. robić to co robisz, ale zamienić samotne "$l" w operatorze ternary i wstawić tam kod w stylu array_unshift ($parts, $l);
Przem4S
Nie wiem już może tępo działam o tej porze ale coś takiego wykminiłem:
  1. $this->lang=(strlen($l = array_shift($parts))==2) ? $l: $config->get('default_language') AND array_unshift($parts, $l);
  2. $this->controller=($c = array_shift($parts)) ? $c: $config->get('default_controller');
  3. $this->method=($m = array_shift($parts)) ? $m: $config->get('default_method');
  4. $this->args=(isset($parts[0])) ? $parts : array();


Po wywołaniu "kontroler/test/abc" mam :

  1. Język: pl
  2. Kontroler: kontroler
  3. Metoda: test
  4. array(1) { [0]=> string(3) "abc" }


Czyli jest ok. Ale tymczasem po wywołaniu "de/kontroler/test/abc":

  1. Język: de
  2. Kontroler: de
  3. Metoda: kontroler
  4. array(2) { [0]=> string(4) "test" [1]=> string(3) "abc" }


Czyli jak by 2 razy unshiftnął to czy jak?
Sephirus
  1. $path = '/lang/controller/method/arg1/arg2';
  2. $chunks = explode('/',trim($path,'/'));
  3. if(strlen($chunks[0]) == 2) {
  4. $this->lang = array_shift($chunks);
  5. } else {
  6. $this->lang = $config->get('default_language');
  7. }
  8. $this->controller=($c = array_shift($chunks)) ? $c : $config->get('default_controller');
  9. $this->method=($m = array_shift($chunks)) ? $m : $config->get('default_method');
  10. $this->args=(isset($chunks[0])) ? $chunks : array();
Przem4S
Tak myślałem że w ternie nie wyjdzie, chciałem to krócej napisać, ale jest ok. Działa poprawnie, dziękuję bardzo za pomoc, leci oczywiście pomógł.

Chciałbym jeszcze o jedną rzecz zapytać, mianowicie chcę wprowadzić języki, czy lepiej będzie tłumaczenia trzymać w bazie czy w plikach?

Tak wiem temat wielojęzykowości istnieje, przewertowałem go.
Do trzymania tłumaczeń w bazie skłania mnie szybka edycja (choćby z panelu),
ale czy jest to warte kosztem szybkości działania bazy itd?
Jak wy trzymacie swoje langi?
redeemer
Cytat(Przem4S @ 15.11.2012, 14:09:08 ) *
Do trzymania tłumaczeń w bazie skłania mnie szybka edycja (choćby z panelu),
ale czy jest to warte kosztem szybkości działania bazy itd?
Jak wy trzymacie swoje langi?
Skorzystaj z bazy danych + cachowanie za pomocą np. memcached.
Sephirus
Cytat(Przem4S @ 15.11.2012, 14:09:08 ) *
Tak myślałem że w ternie nie wyjdzie, chciałem to krócej napisać, ale jest ok.



Wyjdzie smile.gif

  1. $path = '/lang/controller/method/arg1/arg2';
  2. $chunks = explode('/',trim($path,'/'));
  3.  
  4. $this->lang = strlen($chunks[0]) == 2 ? array_shift($chunks) : $config->get('default_language');
  5.  
  6. $this->controller=($c = array_shift($chunks)) ? $c : $config->get('default_controller');
  7. $this->method=($m = array_shift($chunks)) ? $m : $config->get('default_method');
  8. $this->args=(isset($chunks[0])) ? $chunks : array();
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.