Výchozí persistentní parametr z configu
- zbytovsky
- Člen | 18
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
- Tomáš Votruba
- Moderator | 1114
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
@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
@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
@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());
}
- zbytovsky
- Člen | 18
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
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();
}