Masky v route s locale nefungujú podľa očakávania

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Lkopo
Člen | 65
+
0
-

Zdravím, používam na svojom sandboxe tento routing:

$router = new RouteList();
$router[] = new Route('auth/login', 'Sign:in');
$router[] = new Route('auth/logout', 'Sign:out');
$router[] = new Route('<presenter>/<action>[/<id>]/', 'Homepage:default');
return $router;

Čo funguje skvele, auth/login je maska sign/in atď. a zvyšok funguje podľa posledného pravidla.

No, keď som sa pokúšal spraviť lokalizáciu a pridať ju do routingu:

$router = new RouteList();
$router[] = new Route('<locale=cs>/auth/login', 'Sign:in');
$router[] = new Route('<locale=cs>/auth/logout', 'Sign:out');
$router[] = new Route('<locale=cs>/<presenter>/<action>[/<id>]/', 'Homepage:default');
return $router;

Tak sa mi domain.tld/www/ naroutuje na auth/login bez toho, aby som do URL pripisoval /auth/login, okamžite to berie, že sa jedná o toto route. Celé to funguje jedine, keď dám prvé 2 routes na locale do hranatých zátvorkách [], ale chcem dosiahnuť tohto efektu:

/www/cs/auth/login
/www/cs/auth/logout
/www/en/auth/login
/www/en/auth/logout

Inak to funguje takto:

/www/auth/login
/www/auth/logout
/www/en/auth/login
/www/en/auth/logout

Editoval Lkopo (19. 9. 2014 17:45)

Lkopo
Člen | 65
+
0
-

A taktiež keď už sme pri tom, je možné nejak vynútiť presmerovanie na default value namiesto toho, že tam ten default jazyk nastavený je aj bez zadávania parametra do URL?

Čiže zadám /www/ a presmeruje ma to na /www/cs/

japlavaren
Člen | 404
+
+1
-

<locale=cs> nastavi, ze cs je default a preto sa nepouzije…

niesom si isty, ci to bude fungovat, ale skus nastavit toto:
„[!<locale=cs>]/…“

ak nie, skus pouzit „<locale>/…“ a spravit jednosmernu routu s „<locale=cs>“

Editoval japlavaren (19. 9. 2014 21:12)

Lkopo
Člen | 65
+
0
-

Prvý príklad nefunguje, hodí to 404 chybu.

Ten druhý funguje perfektne, rovno to vyrieši aj problém v prvom príspevku. Mám to takto, hádam to je dobré:

$router[] = new Route('[<locale=cs>/]', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<locale>/auth/login', 'Sign:in');
$router[] = new Route('<locale>/auth/logout', 'Sign:out');
$router[] = new Route('<locale>/<presenter>/<action>[/<id>]/', 'Homepage:default');

Edit: ešte mám takú menšiu otázočku k tomu, keď zadám /cs/sign/in tak ma to presmeruje na /cs/auth/login, je možné, aby pri tej prvej možnosti hodilo 404 chybu, alebo je jednoduchšie prepísať Presenter a actiony (AuthPresenter, …)?

Veľmi pekne ďakujem.

Editoval Lkopo (19. 9. 2014 21:08)

japlavaren
Člen | 404
+
0
-

/cs/sign/in ti odchyti posledna routa takze to funguje spravne… nevidim dovod, by ti to malo vadit

ale ak to chces vazne pokne, nevytvaraj dalsie routy, ale pouzi jednu routu na auth a filter tabulku… https://doc.nette.org/…tion/routing

Lkopo
Člen | 65
+
0
-

No ja som nakoniec SignPresenter premenoval na AuthPresenter a z in/out actions spravil login/logout a mám to vo výsledku to isté a jednoduchšie, keďže tvar /sign/in neplánujem používať.

Ale ešte raz vďaka za pomoc, pomohlo mi to veľmi a zrejme by ma nenapadla táto možnosť, síce som si o tejto časti v dokumentácii už X-krát prečítal, asi som ju nepochopil poriadne :D

japlavaren
Člen | 404
+
0
-

obcas do nej aj ja pozerm a napad necche prist :)

japlavaren
Člen | 404
+
0
-

napadla ma este jedna vec – ak to presmerujes takto bude to s 403 a to bude nastalo. mozno by bolo lepsie nechat home na adrese domeny a ostatne smerovat ako /cs/…

tj. zrusit jednosmerku, na home routu <locale=cs> a na ostatnych nechat <locale>

Editoval japlavaren (19. 9. 2014 21:32)

Lkopo
Člen | 65
+
0
-

Tak mi to šlo predtým, ale môj zámer je mať jazyk v URL okamžite.

Editoval Lkopo (19. 9. 2014 21:38)

japlavaren
Člen | 404
+
0
-

potom je to na tebe

Lkopo
Člen | 65
+
0
-

Práve som ešte narazil na problém, ako tieto dáta z routru použiť v šablóne? Chcem podľa jazyka vygenerovať odkazy na en alebo cs verziu.

japlavaren
Člen | 404
+
0
-

este k routam, myslel som to takto
/ – home
/cs/auth/login
/cs/auth/logout
/en/auth/login
/en/auth/logout

cs by bola vzdy castou url, ale nie na home (usetris jeden zbytocny redirect)

na parametre v presenteri mozes pouzit Presenter::getParameter()

a $presenter je standartnou premennou sablony (ako $template, $user a neviem co este…)

Lkopo
Člen | 65
+
0
-
/ – home
/cs/auth/login
/cs/auth/logout
/en/auth/login
/en/auth/logout

Takto mi to fungovalo, keď som mal pravidlo

$router[] = new Route('<locale=cs>/<presenter>/<action>[/<id>]/', 'Homepage:default');

Ale zámerne to chcem tak, aby ma presmerovalo už na začiatku na /cs/.


Čiže prv musím ten parameter získať v presenteri a dať do šablóny a až potom môžem s týmto pracovať, tak?

Editoval Lkopo (19. 9. 2014 21:49)

japlavaren
Člen | 404
+
0
-

presenter mas priamo dostupny v sablone, cize mozes pouzit {$presenter->getParameter(locale)}, i ked cistejsie by bolo predavat si locale do template cez createTemplate metodu v presenteri

Lkopo
Člen | 65
+
0
-

Vďaka opäť, to s tým presenterom v šablóne som netušil.

No ja som to hodil do BasePresenteru do beforeRender, keďže to je v základnom layoute.

Editoval Lkopo (19. 9. 2014 21:58)