routovani – dva jazyky (asi vecne omylane tema :D)

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

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:

  1. 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)
  2. 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
+
0
-
$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
+
0
-

Honza M.
persistentni tu promennou mam (viz to forum). s tim zadanim toho lang mam ale problem s tim, ze se pak preci nezdetekuje podle nastaveni prohlizece, ale proste se tam nejake nacpe (mnou zvolene)… ne?

wdolek
Člen | 331
+
0
-

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-(

Honza Kuchař
Člen | 1662
+
0
-

Není na server eAccelerator?

Ondřej Mirtes
Člen | 1536
+
0
-

Persistentní proménná musí být public.

Ola
Člen | 385
+
0
-

Máš tam @persitent a ne @persi**s**tent

wdolek
Člen | 331
+
0
-

honzakuchar: testuju na localhostu kde eAccellerator mam (po upozorneni Ola a LastHuntera to ale funguje i s tim)

LastHunter: aaaha

Ola: mnojo ;] ale ja to od nekud C&P X-(

Editoval wdolek (22. 10. 2009 18:45)

Ondřej Mirtes
Člen | 1536
+
0
-

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.

wdolek
Člen | 331
+
0
-

LastHunter: ok, diky… a jeste to upresnim pro ty, kteri si tohle vyhledaji nekdy pozdeji

public static function getPersistentParams() { ... }

:) static