routovani – dva jazyky (asi vecne omylane tema :D)
- wdolek
- Člen | 331
snazim se o vytvoreni rout pro jednoduchou aplikaci – jediny presenter (Default), dva jazyky (en, cs)
Route::addStyle('lang', NULL);
Route::setStyleProperty('lang', Route::PATTERN, 'cs|en');
$router[] = new Route(
'<lang>/<action>',
array(
'presenter' => 'Default',
'action' => 'default'
)
);
$router[] = new Route(
'<action>',
array(
'lang' => NULL,
'presenter' => 'Default',
'action' => 'default'
),
Route::ONE_WAY
);
pokud vlezu na: / , nette na me krici, ze neexistuje routa pro
Default:default
pokud vlezu na: /cs/ , stranka se zobrazi, ale pote veskere odkazy konstruovane
pres plink krici, ze neexistuje routa pro tuto akci (vsechny jsou
Default:NejakaAkce)
pokud vlezu na: /en/ , stranka se zobrazi – s tim, ze lang je ale nastavene
na „cs“, a vsechny linky jsou stejne jako pro /cs/ nefunkcni
cerpal jsem z:
https://doc.nette.org/…tion/routing
https://forum.nette.org/…tni-parametr
DefaultPresenter : BasePresenter
...
protected function startup() {
if (!isset ($this->lang)) {
$this->lang = $this->getHttpRequest()->detectLanguage(array('en','cs'));
$this->canonicalize();
}
parent::startup();
}
...
samozrejme bych pozadoval takovouto funkcionalitu:
- pokud clovek vleze na web bez zadaneho jazyka, jazyk se sam zvoli (napriklad podle nastaveni prohlizece), a zaroven bude jazyk platit ve vsech odkazech (tedy vsechny povedou na Default:NejakaAkce kde „lang“ se bude rovnat zvolenemu jazyku)
- pokud clovek vleze na web a zada jazyk (cs|en) zvoli se jazyk, a ve vsech odkazech pak tento jazyk bude figurovat (samozrejme krome linku pro zmenu jazyka)
:s kde je zakopany pes :( co delam spatne :( ?
- Honza Marek
- Člen | 1664
$router[] = new Route(
'<lang>/<action>',
array(
'presenter' => 'Default',
'action' => 'default',
// tady asi bude potřeba výchozí nastavení parametru lang
)
);
Určitě je potřeba nastavit v presenteru parametr lang jako persistentní.
- wdolek
- Člen | 331
router jsem tedy zmenil
Route::addStyle('lang', NULL);
Route::setStyleProperty('lang', Route::PATTERN, 'cs|en');
$defaultLang = Environment::getHttpRequest()->detectLanguage(array('cs', 'en'));
$router[] = new Route(
'<lang>/<action>',
array(
'lang' => $defaultLang,
'presenter' => 'Default',
'action' => 'default'
)
);
a v presenteru mam deklaraci promenne:
/** @persitent */
protected $lang;
i presto ale kdyz jdu na /en/ tak vsechny linky vedou na /cs/nejaka-akce … mel sem za to, ze persistence zaruci, ze se parametr lang sam prida do vsech odkazu se spravnou hodnotu X-(
- Ondřej Mirtes
- Člen | 1536
Abys byl imunní vůči acceleratoru, existuje tento alternativní zápis (tu metodu přidáš do Presenteru, který má ten persistentní parametr:
public function getPersistentParams() {
return array('lang');
}
Anotaci nad property pak už můžeš zrušit.