Routy, více jazyků a použití FILTER IN/OUT
- Danny
- Člen | 146
Zdravím,
prolezl jsem snad všechny příspěvky ohledně toho tématu ale pořád ne a
ne přijít na to jak to správně implementovat.
Mám více jazyků a potřebuji pro ně přizpůsobit URL, na základě kterých pak includovat 1 šablonu. Např
Pro tento presenter a action
Presenter => Info
Action => About
2 případy URL (časem bude i víc)
/cs/info/o-nas
/en/info/about
Oboje URL by měli includovat 1 šablonu about.latte. Která vypadá následovně
{block content}
{include about.$lang.latte}
{/block}
která includuje další šablonu s příslušným názvem země. Např about.en.latte
Našel jsem že by to mělo jít přes FILTER_IN/OUT ale tam
v těch filtrech se mi automaticky adresa přepíše
z EN(about) na CZ(o-nas) a chce includovat
šablonu onas.latte, to já ale nechci.
Potřebuji aby oba includovali about.latte ale pri /cs/ v URL
se jen zobrazil český název URL.
Routy mám takto
public static function createRouter()
{
$router = new RouteList;
$router[] = new Route('[<lang=en [a-z]{2}>/]<presenter>/<action>', [
'action' => 'default'
'presenter' => 'Homepage',
'id' => NULL,
NULL => [
Route::FILTER_IN => function(array $params) {
if($params['lang'] == 'cs') {
if($params['action'] == 'about') {
$params['action'] = 'o-nas';
return $params;
} else {
return NULL;
}
} else {
return NULL;
}
},
Route::FILTER_OUT => function(array $params) {
// ...
return $params;
},
],
]);
return $router;
}
Děkuji moc za jakékoliv rady :)
- Danny
- Člen | 146
Díky, Filter table jsem zkoušel, problém byl ale v tom že se mi vždy brala pouze ta poslední routa uvedená na konci filter table. Viz popisek rovnou v dokumentaci
Jeden presenter může být uveden pod více různými klíči. Pak k němu povedou všechny varianty (tedy vytvoří se aliasy) s tím, že za kanonickou se považuje ta poslední.
Tzn že jsem nemohl udělat.
$route = new Route('<presenter>/<action>/<id>', [
'presenter' => [
Route::VALUE => 'Homepage',
Route::FILTER_TABLE => [
// řetězec v URL => presenter
'o-nas' => 'about',
'about' => 'about',
],
],
'action' => 'default',
'id' => NULL,
]);
Asi blbě chápu jak se to má správně implementovat.
- galab
- Backer | 74
Ty asi potřebuješ něco jako:
$router[] = new Route('<lang=en [a-z]{2}>/<presenter>/<action>',[
'presenter'=>'Info',
'action'=> NULL,
NULL => [
Route::FILTER_IN => function($params){
$params['action'] = 'about';
return $params;
},
Route::FILTER_OUT => function($params){
$langs = ['en'=>'about','cs'=>'o-nas','de'=>'uber-uns'];
$params['action'] = $langs[$params['lang']];
return $params;
}
]
]);
- Ondřej Kubíček
- Člen | 494
@vosy nejjednodušeji asi pomocí překladových slovníků, viz dokumentace – https://doc.nette.org/…tion/routing#…