Routa a jazyk závislý na id
- tomolas
- Člen | 66
Zdravím,
riešim podobný problém ako tu: https://forum.nette.org/…ykove-mutace
ale s tým, že nemám stránku rovnakú v 2 jazykoch. (teda slovenské a
anglické menu sú rôzne)
Potrebujem v route zabezpečiť preklad id=>lang/url a
lang/url=>id
Priklad:
{link Page:default, ‚page_id‘=>1} ⇒ sk/o-nas/kontakt
{link Page:default, ‚page_id‘=>2} ⇒ en/about-us/contact
{link Page:default, ‚page_id‘=>3} ⇒ en/something/not-in/slovak
skúšal som toto:
<?php
Route::addStyle("page_id");
Route::setStyleProperty("page_id", Route::PATTERN, "[a-zA-Z0-9-/]+");
Route::setStyleProperty("page_id", Route::FILTER_OUT, NULL);
$route = new SmarterRoute('<lang ([a-z]{2})>/<page_id>', array(
'presenter' => 'Page',
'action' => 'default',
'page_id' => '',
'lang' => 'sk' // ako sem dostat jazyk podla page_id?? - je to ulozene v DB
));
$route->addFilter('page_id', 'MyRouting::getPageIdByUrl', 'MyRouting::getUrlByPageId'); //tu sa podla page_id vytvori url aj s hierarchiou, napr cesta/k-nejakej/vnorenej-stranke a naopak
$router[] = $route;
?>
len tu je problém, že neviem dať do výslednej url správny jazyk, lebo je závislý na page_id.
Máte niekto nápad ako to spraviť? Alebo to riešim nejak blbo?
- Aurielle
- Člen | 1281
Hospilanova FilterRoute: https://pla.nette.org/…ru-ve-filtru
Aha, to tam už máš… v tom případě nevidím problém, vždyť se ti do
té CB funkce předají i ostatní parametry…
Editoval gmvasek (13. 6. 2011 17:40)
- tomolas
- Člen | 66
Ahaaa,
díki.
Tak mne pomohla úplne posledná veta z toho článku: „Fígl je v tom, že Router zpracuje adresu normálně a filtračním funkcím předává parametr i výsledný PresenterRequest a následně vracenými hodnotami přepíše původní.“
Takže som tie parametre skúsil natvrdo prepísať a zdá sa, že to funguje. Definícia routy teda zostáva, ale mení sa MyRouting::getUrlByPageId takto:
public static function getUrlByPageId($page_id, Nette\Application\PresenterRequest $request){
if(!($data = dibi::query("SELECT page_id, language FROM [pages] WHERE page_id=%i", $page_id)->fetch())){
return false;
}
$pageModel = new Page($data['language']);
$urls = $pageModel->getRootPath($page_id); // zisti cestu k rootu cez parentov
$urls = array_reverse($urls);
$params = $request->getParams(); // <-- povodne parametre requestu
$params['lang'] = $data['language']; // <-- toto je jazyk zisteny z DB
$request->setParams($params); // <-- tu sa prepise parameter 'jazyk' requestu,
// ten sa dostane do vyslednej url, teda do <lang> zadefinovaneho v maske routy
return implode('/', $urls);
}
- David Ďurika
- Člen | 328
Zdravim, riesim podobny problem routovanie my funguje uz sa dostanem aj do getUrlByPageId() ale neviem ako tam ma dostat preklad
<?php
public static function getUrlByPageId($page_id, Nette\Application\PresenterRequest $request){
//takto to volam v mojom BasePresentery,
$translator = $this->context->translator; // je mi jasne ze to $this je tu ine... to je len pre ukazku :)
$translator->setLanguage($request->params['language']);
return $translator->translate($page_id);
}
?>
dakujem za pomoc