Výchozí persistentní parametr z configu

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

Nazdar,

potřeboval bych mít možnost měnit výchozí jazyk. Ten mám v persistetním parametru $lang, ovšem jeho hodnotu můžu nastavit pouze na skalár. Jediné rešení mně napadá úprava PresenterComponentReflection tak, aby šlo z metody getPersistentParams vrátit i ty výchozí hodnoty. Ty si pak už můžu snadno natáhnut z configu.

Ještě mně napadá ve startup() zkontrolovat jestli je NULL a případně přesměrovat na výchozí, ale to mi nepřijde správné…

Nevíte někdo prosím jak by to šlo jinak řešit? Ten PresenterComponentReflection dokonce vypadá, jako by na podobnou situaci byl už připraven ($name=>$meta), myslíte, že mám zkusit pull request?

Díky moc,
Pavel

Aurielle
Člen | 1281
+
0
-

Nemůžeš výchozí hodnotu parametru předat do definice routy? To si myslím že by udělalo přesně to, co chceš…

zbytovsky
Člen | 18
+
0
-

To dělá něco jiného, rozhodně mi to nepřijde jako čisté řešení. Neboť při vypnutém routeru (zapnu třeba simplerouter) se můžu dostat na stav $lang=NULL, ale já bych chtěl aby při prázdném query-stringu byl stejně použitý ten výchozí jazyk (bez ohledu na router).

ajda2
Člen | 66
+
0
-

Vyřešilo se toto nějak? Právě řeším to samé a hledám, jak nastavit výchozí hodnotu presenteru jinak než přímo vepsáním ji v presenteru jako:

/** @persistent */
public $lang = 'cs';

Nejde to třeba nějakou setDefault metodou nastavit např. z DB?
Děkuji za odpovědi.

Tomáš Votruba
Moderator | 1114
+
0
-

Defaultní hodnotu persistentního parametru můžeš nastavit mimo parametr samotný např. takto:

/** @persistent */
public $lang = "";

protected function startup()
{
	parent::startup();
	$this->lang = (
		// je v routě? použij!
		$this->lang ? $this->lang :
		// pokud není v routě, zkus najít v configu
		isset($this->context->parameters["lang"]) ? $this->context->parameters["lang"] :
		// pokud není v konfigu, předej hodnotu z db
		$this->context->db->settings->getDefaultLang()
	);
}

Další inspirace viz NetteTranslator

Editoval Schmutzka (12. 6. 2012 12:22)

zbytovsky
Člen | 18
+
0
-

@schmutzka:

Myslím že se to potom bude chovat jinak. Protože třeba třída Route si tahá hodnotu přímo z PresenterComponentReflection (resp. getPersistentParams()). Proto by bylo lepší a dle mého logické rozšířit tuhle metodu.

@ajda2 setDefault:

Zkus prosím ťuknout do pull requestu: https://github.com/…tte/pull/445 … třeba by se to už mohlo dostat do distribuce. Dík.

ajda2
Člen | 66
+
0
-

@schmutzka:
Moc děkuji za odpověď, ale špatně si mě pochopil. Můj problém není, že bych nevěděl, jak nastavit property. Problém je v tom, že pokud ji nastavím v metodě startup(), tak pořád má property již výchozí hodnotu (u Tebe je to prázdný řetězec) a každá již mnou nastavená, se nebere jako výchozí a zobrazuje se v URL.
Já potřebuji nastavit čistou výchozí hodnotu v BasePresenteru tak, abych nemusel šahat do routy a nastavovat tam výchozí hodnotu.
Chci aby to fungovalo stejně jako když nastavím výchozí hodnotu ‚cs‘, tak se mi potom v URL nezobrazuje lang=cs, protože je to výchozí hodnota. Snad sem to popsal srozumitelněji :-)

//EDIT: Jde mi o dynamickou změnu výchozí hodnoty persistentního parametru.

Editoval ajda2 (12. 6. 2012 13:08)

zbytovsky
Člen | 18
+
0
-

@ajda2

jojo, přesně to řeší ten pull-request … https://github.com/…tte/pull/445 Kdyby byl přijatý, pak by stačilo napsat:

function getPersistentParams(){
  return array('lang' => $this->context->db->settings->getDefaultLang());
}
bene
Člen | 82
+
0
-

Jen nápad. Zkoušel jsi tu property nastavit ještě před voláním předka parent::startup(). Předpokládám, že až v startupu se děje vše kolem persistentních proměnných, komponent, aj.

zbytovsky
Člen | 18
+
0
-

bene napsal(a):
Jen nápad. Zkoušel jsi tu property nastavit ještě před voláním předka parent::startup(). Předpokládám, že až v startupu se děje vše kolem persistentních proměnných, komponent, aj.

Viz první příspěvek – tohle zařizuje PresenterComponentReflection pomocí get_class_vars() a to vrátí fakt jen to co je přímo zadrátované… :-(

Editoval zbytovsky (13. 6. 2012 12:36)

bene
Člen | 82
+
0
-

Jo vlastně, proto tam jsou ty staticke metody getPersistentParams/Components. No a pokud by jsi tuto metodu přetížil a reflexi by to v teto metodě nastavit nešlo? Nevim, jestli reflexe umožňuje nastavit vychozí hodnotu property. Pokud jo, tak by to mělo tvůj problém vyřešit.

public static function getPersistentParams()
{
	// nastaveni reflexi vychozi hodnotu property $lang
	return parent::getPersistentParams();
}