Routa a jazyk závislý na id

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tomolas
Člen | 66
+
0
-

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

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

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

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