Routa se změní při překladu

wonka007
Člen | 11
+
0
-

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
+
0
-

<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
+
0
-

Č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
+
0
-

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
+
0
-

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
+
0
-

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.