Komponenta – persistentní signály? Více signálů najednou?

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

Rád bych se zeptal.
Vytvářím si komponentu, která zobrazuje např. telefonní seznam (jméno, příjmení, telefon). Chtěl bych, aby součástí komponenty byl seznam s abecedou, kde po kliknutí na písmenko, by se zobrazily kontakty začínající přijmením na toto písmeno.
To bych – jestli to dobře chápu – udělal tak že v komponentě bych vytvořil metodu reagující na signál

public function handleShowBeginingByLetter($char){
        $this->selected = $this->selected->where ... //kde \Selection $selected je celý seznam
    }

která se vykoná před render(), tudíž by mi komponenta měla zobrazit můj požadavek.

Ale co kdybych chtěl ještě navíc, třeba – teď plácnu – k tomu ještě přidat jeden odkaz se signálem sortByPhonenumber!, který by měl setřídit zobrazené kontakty od „A“ podle telefonního čísla?

Četl jsem že signál slouží jenom jako změna stavu, že by „persistentní“ neměl být (ani nevím jestli to jde, a jestli ano tak jak?)

Jak se toto řeší? Mám to řešit na úrovni presenteru – kdy bych asi do komponenty posílal nějaké další parametry?

Nevím jestli ta otázka není úplně mimo, díky za každé nakopnutí.

Editoval thm (16. 5. 2013 14:52)

peter.z
Člen | 37
+
0
-

Kludne to mozes riesit v komponente. Na tvojom mieste by som si vytvoril dva (prip. tri ak chces menit aj smer zoradenia, napr. od najstarsieho po najnovsi alebo naopak) perzistentne parametre:

/** @persistent */
public $letter;

/** @persistent */
public $orderBy;

Kde $letter je pismenko a $orderBy je stlpec, podla ktoreho chces tie zaznamy zoradit. Dalej si vytvoris dva signaly:

public function handleLetter($letter)
{
	$this->letter = $letter;
}

public function handleOrderBy($orderBy)
{
	$this->orderBy = $orderBy;
}

Nette sa postara samo o spravne vytvorenie odkazov tak, aby tie perzist. parametre boli v odkaze. Pokial mas tu komponentu AJAXovu, uprav si ju nasledovne:

public function attached($presenter)
{
	parent::attached($presenter);

	if ($presenter->isAjax()) $this->invalidateControl();
}

To sa postara o spravne prekreslenie snippetov. A nakoniec v render() metode len vytiahnes z premennych $letter a $orderBy udaje, ktore potrebujes dostat do SQL.

K tvojej otazke: sinaly nie su perzistentne parametre. Perzistentne parametre su prakticky len public premenne alebo komponenty s anotaciou @persistent.

thm
Člen | 147
+
0
-

Díky moc za rychlou odpověď. Je to přesně to, co jsem potřeboval vědět! Jdu to hned vyzkoušet.

duke
Člen | 650
+
0
-

peter.z napsal:

Pokial mas tu komponentu AJAXovu, uprav si ju nasledovne:

public function attached($presenter)
{
	parent::attached($presenter);

	if ($presenter->isAjax()) $this->invalidateControl();
}

To sa postara o spravne prekreslenie snippetov.

Pokud se nemýlím, tak toto řešení způsobí, že při každém ajaxovém požadavku se budou (někdy zbytečně) posílat všechny snippety.

peter.z
Člen | 37
+
0
-

Ano, pokial sa na stranke spustaju aj ine AJAX poziadavky ako len z komponenty. Ale ak je na stranke AJAX len pri linkoch ku komponente, tak je to podla mojho nazoru lepsie riesenie, ako pri kazdom handle…() pisat nieco podobne:

if ($this->presenter->isAjax()) {
	$this->invalidateControl();
} else {
	$this->presenter->redirect('this');
}
duke
Člen | 650
+
0
-

peter.z napsal:

Ano, pokial sa na stranke spustaju aj ine AJAX poziadavky ako len z komponenty. Ale ak je na stranke AJAX len pri linkoch ku komponente, tak je to podla mojho nazoru lepsie riesenie, ako pri kazdom handle…() pisat nieco podobne:

if ($this->presenter->isAjax()) {
	$this->invalidateControl();
} else {
	$this->presenter->redirect('this');
}

Toto řešení rovněž (někdy zbytečně) pošle všechny snippety (tj. i ty, u kterých nedošlo k nijaké změně) (což lze ovšem v tomto případě snadno vyřešit specifikací parametru metody invalidateControl). Nicméně toto je již o něco lepší, protože se budou posílat snippety jen v případě zpracování signálu touto komponentou. Při použití attached by se v některých případech posílaly všechny snippety této komponenty i při signálech jiných komponent.

Psát komponenty tak, že se předem spoléháme na to, že bude komponenta jedinou komponentou presenteru, IMHO není ideální přístup.