Flow routování, šablon a jazyků
- Dan Hundrt
- Člen | 74
Dobrý den,
rád bych se poradil, jak řešit následující situaci. Mám fyzickou stránku:
domain.tld/cs/doprava
Šablona stránky se setuje v presenteru, routing vypadá zatím takto (provizorně):
$router[] = new Route('cs/doprava', "Delivery:default");
Stránka je plná textů a obrázků + interkativního obsahu v HTML. Jak by jste řešili stav, kdy chcete udělat en + de verzi (identicky, jiný jazyk a URL + meta)? Dávat text do lang-u (neon) mi přijde nesmysl, váhám mezi použití DB, popřípadě dalších šablon. Pokud bych vybral fyzické šablony, jak řešit URL v routeru?
Díval jsem se na vendor Kdyby/Translation, ten by to měl umět, není mi však jasné, jak si nastavit jinou URL, tzn:
$router[] = new Route('[<locale=cs>]/doprava', "Delivery:default"); // Zavolá se metoda renderDefault() z DeliveryPresenter
$router[] = new Route('[<locale=en>]/delivery', "Delivery:default"); // toto nebude fungovat
Volat metodu např. renderDefaultCS a změnit v routeru?
Cíl je, aby v presenteru i routeru bylo co nejméně „balastu“.
- Zdeno1981
- Člen | 115
Ahoj @DanHundrt,
řešení pro fyzické stránky je celkem jednoduché v presenteru budeš potřebovat parametr $lang, viz https://doc.nette.org/…n/presenters#…
Šablonu pak budeš určovat dle toho parametru, za předpokladu, že názvy šablon budeš mít Delivery.cs.latte, Delivery.en.latte atd…
public function beforeRender()
{
parent::beforeRender();
// Nastav si dle toho šablonu.
$this->setView($this->lang);
// kdyby jsi potřeboval parametr lang v šabloně.
$this->template->lang = $this->lang;
}
Jazyky v šabloně pak můžeš takhle přepínat:
<a n:href="this, 'lang' => 'cs'">Czech</a>
<a n:href="this, 'lang' => 'en'">English</a>
Routa ti pak bude stačit jedna:
$router[] = new Route('[<lang=cs cs|de|en>]/doprava', "Delivery:default");
Snad jsem ti pomohl :)
Editoval Zdeno1981 (13. 2. 2017 10:50)
- Dan Hundrt
- Člen | 74
Super díky, moc, zítra zkusím.
Šablonu pak budeš určovat dle toho parametru, za předpokladu, že názvy šablon budeš mít Delivery.cs.latte, Delivery.en.latte atd… Tady má ještě mám dotaz, jestli půjde měnit URL, něco jako:
- cs/doprava
- en/delivery
- de/lieferung
Router v této konfiguraci bude vracet cs/doprava vždy, jestli se nepletu:
$router[] = new Route('[<lang=cs cs|de|en>]/doprava', "Delivery:default");
$router[] = new Route('[<lang=cs cs|de|en>]/delivery', "Delivery:default");
$router[] = new Route('[<lang=cs cs|de|en>]/lieferung', "Delivery:default");
Tady musím definovat v Presenteru pro každou url metodu render zvlášť?
Díky moc :-)
Editoval Dan Hundrt (13. 2. 2017 23:09)
- Marek Bartoš
- Nette Blogger | 1264
@DanHundrt tak, jak jsi to zapsal ti to matchne cs/doprava, de/doprava, en/doprava a pro ty další 2 to samé (cs/delivery, atd.)
To, co hledáš jsou transformace
a překlady
Pomocí callbacku si parametry přeložíš a zkontroluješ, zda jsou ve
stejném jazyce.
Eventuální a jednodušší varianta je si nadefinovat routu pro každý jazyk zvlášť
$router[] = new Route('[<lang=cs>]/doprava', "Delivery:default");
Editoval Mabar (14. 2. 2017 0:30)