signály vs perzistentní parametry

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

Zdravim, mel bych jeden dotaz..

pokud rekneme v ramci komponenty pouziji perzistentni parametr (napr. $okno) a zaroven mam signal (napr. „rozbal“ ktery ktery ma taktez parametr $okno) tj. vypada to treba nasledovne:

<?php
class NejakaKomponenta extends Control
{
	/** @persistent */
	public $okno = 0;
	...
	handleRozbal($okno, $kam)
	{
		...
	}
	...
}
?>

Pokud pouzivam zaroven perzistentni parametr a parametr signalu „rozbal“ tak ten signalovy „pretizi“ ten perzistentni (hodnota v nem je nahrazena tou signalovou)… No a me by zajimalo zde je to vlastnost, chyba nebo jak – jaka jsou vlastne vztahy mezi temito hodnotami resp. signaly a perzistentnimi parametry. Logicky bych ocekaval ze vztah by mezi nimi nemel byt zadny – (resp. je jasne ze bych si mel sam pohlidat aby se tyto nazvy neprekryly pokud to tak nechci)

V dokumentaci se o tom moc nepise a navic mam pocit ze casti tykajici se parametru u signalu nejsou v dokumentaci vysvetleny prilis stastne, sam jsem to pochopil tak jako by parametry u handle metod musely byt nazvany tak aby do nich „zapadl“ nektery z parametru v URL a pritom se v ramci {link signal, parameters} sami nastavuji, v quick startu je pak prave „pretizen“ parametr $page aby to fungovalo..

No mozna jsem ale mimo a nekdo me presne vysvetli jak se veci maji..

Diky za Vas cas, P.

David Grudl
Nette Core | 8218
+
0
-

crempa napsal(a):

Pokud pouzivam zaroven perzistentni parametr a parametr signalu „rozbal“ tak ten signalovy „pretizi“ ten perzistentni (hodnota v nem je nahrazena tou signalovou)… No a me by zajimalo zde je to vlastnost, chyba nebo jak – jaka jsou vlastne vztahy mezi temito hodnotami resp. signaly a perzistentnimi parametry. Logicky bych ocekaval ze vztah by mezi nimi nemel byt zadny – (resp. je jasne ze bych si mel sam pohlidat aby se tyto nazvy neprekryly pokud to tak nechci)

Pro pochopení možná bude nejlepší celou věc vysvětlit pozpátku; obráceně, než jak skutečně vznikla. Zkusme to.

Začnu tím, že ty parametry se od sebe vlastně téměř neliší.

Každá komponenta (tedy i presenter) má přidělen jeden jmenný prostor a v něm sídlí všechny parametry. Balík všech parametrů je uložen v poli $params každé komponenty, dá se k nim přistupovat také metodou getParam(...).

Parametry nastavíme třeba metodou link(), kolem které se to vlastně všechno točí:

$this->link('rozbal!', array('param1' => 123, 'param2' => TRUE, 'param3' => $id));

Tzv. parametry signálů (a platí to i pro parametry metod action— nebo render—) s liší jen v tom, že nám zjednodušší zápis odkazů. Pokud existuje metoda handleRozbal($param1, $param2), stačí psát:

$this->link('rozbal!', array(123, TRUE, 'param3' => $id)); // první dva se párují s param1 a param2

Stejně tak i persistentní parametry se liší jen v drobnosti – v tom, že je nemusíme v odkazech uvádět vůbec. Pokud bude param3 persistentní, stačí psát:

$this->link('rozbal!', array(123, TRUE)); // param3 se doplní automaticky

V takovém případě je možné vynechat array():

$this->link('rozbal!', 123, TRUE);

U persistentních parametrů se ještě navíc pro snažší přístup vytváří reference mezi položkou ve zmíněném poli $params a proměnnou objektu, tj. $this->param3 = & $this->params['param3'].

Je to takto srozumitelnější?

Mas3r
Člen | 116
+
0
-

Je možné nějak nastavit, aby persistentní parametry u komponenty neobsahovaly název té komponenety? Mě te zápis připad strašně dlouhý…

crempa
Člen | 198
+
0
-

Diky Davide uz je to mnohem jasnejsi, ona je ta dokumetace tak vlastne spravne, jako klicove vidim ono

Každá komponenta (tedy i presenter) má přidělen jeden jmenný prostor a v něm sídlí všechny parametry

doted jsem videl jednotlive parametry „rozskatulkovany“ podle toho v jakem kontextu (signal,perzistent…) jsou pouzity resp. jak se predavaji.. takhle uz to vse dava smysl :-)

ad Mas3r: podle me je to nutnost, jak by jsi pak rozlisil takove parametry v pripade pouziti stejne komponenty vicekrat v ramci jednoho presenter:view? V quick startu si treba muzes vlozit ukazkovou tabulku na jednu stranu vicekrat pouhym vytvorenim dalsi instance komponeny (s jinym nazvem) a na obou bezproblemu a vzajemnych zavislosti bude fungovat strankovani i razeni…

Mas3r
Člen | 116
+
0
-

Jo to je mi jasné, takže by to pak chtělo zajistit, zda nejsou v Presenteru atd stejné presistentn parametry.

A.
Člen | 87
+
0
-

Mas3r napsal(a):

Je možné nějak nastavit, aby persistentní parametry u komponenty neobsahovaly název té komponenety? Mě te zápis připad strašně dlouhý…

Toje pouze interni pojmenovani v Nette. S tou promennou pracujes normalne s kratkym nazvem.