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. :)