Metoda isSignalReceiver() v komponentách

- romansklenar
- Člen | 655
Často potřebuju zjišťovat, je-li komponenta příjemcem určitého signálu a tuto funkčnost si do komponent vždycky dopisuju:
class BaseControl extends Control
{
...
/**
* Checks if component is signal receiver.
* @param string signal name
* @return bool
*/
public function isSignalReceiver($signal = TRUE)
{
return $this->getPresenter()->isSignalReceiver($this, $signal);
}
}
Protože je to jednořádková implementace, napadlo mě, že by se dala
použít rovnou v PresenterComponent nebo by tato metoda mohla být
součástí rozhraní ISignalReceiver.

- romansklenar
- Člen | 655
Toto řešení má v momentálním stavu frameworku jednu nevýhodu – po zpracování signálu už ji nelze spolehlivě použít, protože se v presenteru mažou stopy o obdrženém signálu poté co je zpracován.
Proto se chci zeptat – je nutné nulovat tuto proměnou? Zkusil jsem si v aplikacích tento řádek v presenteru zakomentovat a nepozoruju v nich žádné chyby.

- David Grudl
- Nette Core | 8285
Je to z toho důvodu, že signál lze zpracovat už dříve (např. během
metody action<Action>()) a aby se poté nezpracoval znovu,
proměnná se vynuluje.
Asi by to šlo řešit jinak – ale spíš se zeptám, pro jaký případ to následně zjišťovat potřebuješ?
ad metoda isSignalReceiver: to je dobrý nápad, jen bych musel
přejmenovat metodu Presenter::isSignalReceiver na
Presenter::isComponentSignalReceiver (což by asi bylo vhodné).
Tedy aby chování isSignalReceiver bylo stejné pro všechny
komponenty, včetně presenteru.

- romansklenar
- Člen | 655
Aha, hned je to jasné :) díky za reakci.
V podstatě je důvod stejný jako tady, jen je to jiné čistější řešení, které mě napadlo, protože vlákno zůstalo mrtvé.
Používám to v datagridu na pár místech, ale před
vykreslením už se to nedá spolehlivě použít (ikdyž toto není zrovna
nejlepší příklad, protože na formuláři by se to dalo nahradit pomocí
$this->getForm()->isSubmitted()).
Na formuláři ale nemůžu při jeho vytváření použít
isSubmitted() protože pokud si dobře vzpomínám, nebyly pak v
$form->getValues() všechna data správně
(isSubmitted() v takové případě volá
processHttpRequest() a tam k tomu myslím docházelo – teď
mě napadá jestli nejde o nějakou zákeřnou chybu – ještě
ověřím). Takže nebyl způsob jak při vytváření formuláře
spolehlivě zjistit, jestli je příjemcem signálu 'submit' a
podle toho pak ovlivnit jeho generování.
Každopádně pro Controly by se mohlo při nějakých
složitějších aplikacích hodit oveření i v pozdějších fázích
životního cyklu, jestli příjímala ten a ten signál.

- romansklenar
- Člen | 655
Takže to s tím formulářem potvrzuju – pokud je voláno
isSubmitted() v továrničce kde je vytvářen a je volán
z presenteru, protože přijímá zrovna signál submit, tak to
naruší odeslaná data.
Není tedy způsob jak bez vedlejších efektů při vytváření formuláře továrničkou zjistit, jestli byl i odeslán.
Šlo by tedy zapracovat úpravu, kterou jsi navrhoval o 2 příspěvky výše? Mám napsat path?

- romansklenar
- Člen | 655
Na názvu moc nesejde. Důležité je, aby bylo v Nette jak ověřit, zda-li je komponenta příjemcem signálu i ve vykreslovací fázi životního cyklu.

- Honza Kuchař
- Člen | 1662
Ahoj, napsal jsem si tedy metodu isSignalReceiver pro
komponenty. Ale nevím jestli dělá přesně to co měla dělat ta původně
zamýšlená fce.
/**
* Is $component receiver of $signal?
*
* @param PresenterComponent $component
* @param string $signal
* @return bool
*/
function isSignalReceiver(PresenterComponent $component,$signal){
$_signal = $this->presenter->getSignal();
if($_signal[0]==$component->getUniqueId() and $_signal[1]==$signal)
return true;
else
return false;
}
Pokud to někomu pomůže budu, rád. Pokud je to úplně mimo, tak mi prosím řekněte. Já to smažu. :)