Routa se změní při překladu
- wonka007
- Člen | 11
Zdravím,
potřeboval bych zprovoznit routování s podporou více jazyků. Zkoušel jsem
použít FILTER_TABLE. S ním dokážu ukázat na stejnou akci pomocí dvou
slov, ale vždy se mi změní URL, když použiji to druhé definované.
Potřeboval bych, aby URL zůstala v tom jazyce, ve kterém byla napsaná.
Jak si představuji, že by to mělo fungovat.
Zadaná URL ⇒ Zobrazená action ⇒ Konečná URL zobrazená po
načtení stránky
/en/calendar ⇒ Homepage:calendar ⇒ /en/calendar
/cs/kalendar ⇒ Homepage:calendar ⇒ /cs/kalendar klidně /kalendar
/kalendar ⇒ Homepage:calendar ⇒ /kalendar klidně /cs/kalendar
Zatím se mi povedlo pouze:
/en/calendar ⇒ Homepage:calendar ⇒ /en/kalendar
/cs/kalendar ⇒ Homepage:calendar ⇒ /kalendar
/kalendar ⇒ Homepage:calendar ⇒ /kalendar
A to pomocí tohoto:
$router->addRoute('[<lang=cs [cs|en|de|pl]{2}>/]kalendar', 'Homepage:calendar');
$router->addRoute('[<lang=cs [cs|en|de|pl]{2}>/]calendar', 'Homepage:calendar');
A pokud by to bylo možné, tak bych potřeboval i vědět, jak umožnit složit více slov do jedné akce. Aby mohli vzniknout adresy jako třeba www.domena.cz/visit-up
Předem děkuji.
- Marek Bartoš
- Nette Blogger | 1275
<lang=cs [cs|en|de|pl]{2}>
Tímhle zápisem říkáš, že je v routě proměnná lang, s výchozí
hodnotou cs a možnými hodnotami cs, en, de a pl
Jestliže má routa matchnout jen s jedním jazykem, tak musíš dovolit pouze
ten
Jinak se na druhou routu v pořadí nikdy nedostane
jak umožnit složit více slov do jedné akce. Aby mohli vzniknout adresy jako třeba www.domena.cz/visit-up
Parametry jsou oddělené lomítkem, takže se pro víceslovné názvy nic nemění, pokud nemají onu pomlčku obsahovat
Jestliže se mají správně překládat routy s více parametry (s lomítkem), tak je cesta skrze FILTER_IN a FILTER_OUT pro celou routu, namísto jednoho parametru. Jinak by ti procházely routy ve stylu /cz-parameter/en-parameter
- Marek Bartoš
- Nette Blogger | 1275
Čistě statické routy (bez použití filtrů) vůbec nemusí z parametru dělat proměnnou, můžeš je zapsat staticky
$router->addRoute('/en/calendar', [
'presenter' => 'Homepage',
'action' => 'calendar',
'lang' => 'en',
]);
// ONE_WAY se matchne, když se objeví v url, pro generování url se nikdy nepoužije a matchne až následující
$router->addRoute('/cs/kalendar', [
'presenter' => 'Homepage',
'action' => 'calendar',
'lang' => 'cs',
], Route::ONE_WAY);
$router->addRoute('/kalendar', [
'presenter' => 'Homepage',
'action' => 'calendar',
'lang' => 'cs',
]);
Editoval Marek Bartoš (28. 9. 2022 21:32)
- wonka007
- Člen | 11
Moc děkuji za rychlou odpověď.
Využiji tedy filtry, jelikož budu chtít přidávat stránky dynamicky (uživatel je bude vytvářet).
Chápu správně, že kombinace jazyků a názvů si mohu uložit někde
v databázi a udělat na ně query právě ve filtru?
když budu mít třeba URL /visit-us/ubytování-hradec_krarlove nebo
/visit-us/restaurace-brno. Mohu tedy vyextrahovat data pomocí
„visit-us/<article>“ a tak použít proměnnou article při
vyhledání v databázi pro najití správného článku? Nebo musím předem
veškeré stránky deklarovat for loopem?
Ještě upřesnění k těm pomčkám… Jak by vypadala akce a template pro akci visit-us? POřád mi totiž nette hází error „action name is not valid“
- Marek Bartoš
- Nette Blogger | 1275
Chápu správně, že kombinace jazyků a názvů si mohu uložit někde v databázi a udělat na ně query právě ve filtru?
Ano, je to možné. Přijde mi však, že tyhle věci do routeru nepatří a
měl by řešit pouze strukturu URL. Jestliže všechny články mají URL ve
formátu visit-us/<article>
, tak routa má matchnout, ať už
bude hodnota <article> jakákoli a nepokoušet se matchnout další
v pořadí. Zda <article> existuje v databázi a zda patří
k aktuálnímu <lang> můžeš řešit až v presenteru. V tom můžeš
vyhodit BadRequestException nebo přesměrovat na správnou variantu snadněji,
než v routeru.
Jak by vypadala akce a template pro akci visit-us? POřád mi totiž nette hází error „action name is not valid“
Jaká routa se ti matchne? Není to nějaká obecná, která v sobě má proměnnou <action>? Pokud ji tam máš, tak by měla být až po těch konkrétních.
Osobně ty obecné routy nemám vůbec a píšu si pro každou akci presenteru vlastní routu.
- wonka007
- Člen | 11
Moc děkuji za pomoct.
Nakonec jsem pro každý typ stránky přidal záznam takto:
$router->addRoute('<lang [en]{2}>/visit-us[/<article>]', 'Pobrdi:destinations');
$router->addRoute('[<lang=cs [cs]{2}>/]navstivete-nas/<article>]', 'Pobrdi:destination');
A v presenteru pak budu analyzovat persistentní $article.
Ještě jednou moc děkuji a přeji hezký den.