Routy, více jazyků a použití FILTER IN/OUT

Danny
Člen | 146
+
0
-

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 :)

CZechBoY
Člen | 3608
+
0
-

Oboje to naved na stejny presenter+akci, sablonu nastavis v presenteru pres $this->template->setFile(…);

Danny
Člen | 146
+
0
-

Nasetovat šablonu přes

$this->template->setFile(…);

není problém, ale mě jde právě o to jak to navést na tu jednu akci. Abych se dostal z 2 různých adres právě tam kde udělám

$this->template->setFile(…);

Editoval Danny (16. 5. 2017 10:36)

CZechBoY
Člen | 3608
+
+1
-

Otrocky třeba takhle

$router[] = new Route('cz/o-nas', ['presenter'=>'Info', 'action'=>'about', 'lang'=>'cz']);
$router[] = new Route('en/about', ['presenter'=>'Info', 'action'=>'about', 'lang'=>'en']);
Danny
Člen | 146
+
0
-

Díky za tip :) .Ono těch presenteru a actionů bude hodně a takhle bych se asi upsal, nešlo by to řešit nějak elegantněji? Nejlépe nějakým slovníkem nebo tak. Jestli mě můžeš trochu nakopnout :)

CZechBoY
Člen | 3608
+
0
-

Jasně, můžeš si udělat tabulku překladů
https://doc.nette.org/…tion/routing#…

Danny
Člen | 146
+
0
-

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

Ty ale řešíš action, ne presenter, takže třeba takto:

$router[] = new Route('[<lang=en [a-z]{2}>/]<presenter>/<action>',[
            'presenter'=>'Info',
            'action'=>[
                Route::VALUE => 'about',
                Route::FILTER_TABLE => [
                    'o-nas'=>'about',
                    'a-propos-de'=>'about',
                    'uber-uns'=>'about'
                ]
            ]
        ]);
Danny
Člen | 146
+
0
-

Díky, jasně to jsem přehlídl, samozřejmě bych to dělal na action, ale tímhle docílím toho že mě všechny URL uvedené v tom filtru přesměrují na ten poslední

uber-uns

A to je pro mě nepraktický aby uživatel který chce EN jazyk se mu bude zobrazovat uber-uns

nebo se mýlím?

galab
Backer | 74
+
+2
-

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;
        }
    ]
]);
Danny
Člen | 146
+
0
-

Omlouvám se za pozdější odpověď.

galab Díky moc funguje to přesně tak jak jsem chtěl

Editoval Danny (26. 5. 2017 15:09)

vosy
Člen | 525
+
0
-

Ahoj, jak by mohl vypadat filtr aby pro cestinu byla adresa domena.cz/o-nas a pro anglickou domena.cz/en/about a pro nemeckou domena.cz/de/…

dix

Ondřej Kubíček
Člen | 494
+
+1
-

@vosy nejjednodušeji asi pomocí překladových slovníků, viz dokumentace – https://doc.nette.org/…tion/routing#…