Komponenta – persistentní signály? Více signálů najednou?
- thm
- Člen | 147
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
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.
- duke
- Člen | 650
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
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
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.