Zjisteni signalu (odeslaneho formulare) v komponente

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

Chtel bych se zeptat, zda je mozne nejak v komponente zjistit odeslani formulare na webu. Priklad: na webu zobrazuji formula, komponenta zobrazuje urcity text. Po odeslani formulare na strance bych chtel nejak v komponente zachytit, ze se to stalo, abych napriklad mohl upravit naka data v DB a vypsat text. Nechci zasahovat do odesilaciho formulare ci zpracovavajici funkce, aby byla komponenta oddelena od aplikace.

Nevim jestli je to vubec mozne nak zjistit, protoze chapu ze po provedeni zpracovani signalu ty data o signalu uz neexistuji. Dalo by se to nak resit bez zasahu do funkce na zpracovani formulare?

Editoval saimons (25. 10. 2012 16:57)

saimons
Člen | 293
+
0
-

Pokusim se to jeste trochu zkonkretizovat: Zobrazuiji uzivatelum tutorial pomoci komponenty a potrebuji nejak zjistit jestli uzivatel udelal to co mel, abych mohl zobrazit dalsi krok tutorialu. Potreboval bych nejak zjistit, ze odeslal konkretni formular (zjistit v komponente), nezajima me co odeslali protoze o to se postara validace, jen to ze byl odeslan. Dalo by se to zjistovat na urovni DB, ale to mi nepripada idelani, protoze kdyz zmenim strukturu, tak budu muset myslet na to, ze musim neco zmenit i v komponente.

vvoody
Člen | 910
+
0
-

$form->onSuccess je pole, môžeš tam bez problému zavesiť o jeden callback naviac (ten z komponenty).

saimons
Člen | 293
+
0
-

Aha tak tohle me vubec nenapadlo. Diky za radu.

saimons
Člen | 293
+
0
-

Jeste mam takovy dotaz, jak ten callback (nekde v nakem Presenteru) prinutim aby volal nakou funkci v komponente?

Napr:

<?php

namespace Components;

class CTutorialControl extends UI\Control {

...

	public function testSubmitted() {
	}
}
?>
vvoody
Člen | 910
+
0
-

Čo ti v tom bráni? V presenteri máš dosah na tú komponentu.

saimons
Člen | 293
+
0
-

Jako klasicky takhle:

<?php

$tutorial = new \Components\CTutorialControl($this->context);
$form->onSuccess[] = callback($tutorial, 'testSubmitted');

?>

Editoval saimons (29. 10. 2012 18:05)

vvoody
Člen | 910
+
0
-

Vieš čo, radšej si to poriadne premysli. Nezdá sa ti že zavesiť callback z presenteru na formulár v komponente, pričom ten callback (v presenteri) volá funkciu z komponenty…, je už trochu bordel? Na začiatku tohto vlákna si písal, že ten callback je funkcia z komponenty.

saimons
Člen | 293
+
0
-

Takhle mam tu strukturu, nevim jak jednoduseji to udelat abych v te komponente mohl zpracovavat odeslany formular. Pokud je jeste jina cesta, rad se poucim. Ale stejne mi to pripada takove, ze ta komponenta neni oddelna od ostatnich aplikaci.

<?php
namespace AkceModule;

class AkcePresenter extends SecuredPresenter {

    /**
     * Zverejnit akci
     * @return \Nette\Application\UI\Form
     */
    protected function createComponentJuniorsForm() {
        $form = new UI\Form;

        $form->addSubmit('save', 'Zveřejnit');

        $tutorial = new \Components\CTutorialControl($this->context);
        $form->onSuccess[] = callback($tutorial, 'testSubmitted');
        $form->onSuccess[] = callback($this, 'zverejnitFormSubmitted');
        return $form;
    }




namespace Components;

class CTutorialControl extends UI\Control {

...

    public function testSubmitted() {
    }
}
?>

Editoval saimons (29. 10. 2012 18:16)

vvoody
Člen | 910
+
0
-

Kde máš továrničku na tu komponentu?

saimons
Člen | 293
+
0
-

Tu mam normalne v BasePresenteru:

protected function createComponentTutorial() {
    $tutorial = new Components\CTutorialControl($this->context);
    $tutorial->dateTimeZone = $this->dateTimeZone;
    return $tutorial;
}

Editoval saimons (30. 10. 2012 1:11)

OK3
Člen | 91
+
0
-

Je důvod, proč ten formulář není součástí té komponenty?

saimons
Člen | 293
+
0
-

Je, protoze ten formular je klasickej formular v modulu, kde jich je dalsich x. A ta komponenta ma za ukol provest nove uzivatele vsemi moznostmi, co muzou v systemu delat. tato komponenta tutorial by mela byt co nejmene zavisla na ostatnim kodu (nejlepe vubec), aby se pri zmenach v modulech nemuselo myslet na tutorial.

saimons
Člen | 293
+
0
-

Jeste by to slo resit v metode startup(), kde bych zavolal model komponenty, tam otestoval potrebna data. Sice by nebylo vsechno soucasti komponenty, ale vyhodnoceni (tutorial) by bylo oddelene od ostatni aplikace. Co na toto reseni rikate?

vvoody
Člen | 910
+
0
-

Komponentu inštancuje vždy len jej továrnička, všade inde ju získame pomocou ArrayAccess alebo metódou getComponent z rodičovskej komponenty (presenteru).

protected function createComponentJuniorsForm() {
    $form = new UI\Form;

    $form->addSubmit('save', 'Zveřejnit');

    $tutorial = $this['tutorial'];
    $form->onSuccess[] = callback($tutorial, 'testSubmitted');
    $form->onSuccess[] = callback($this, 'zverejnitFormSubmitted');
    return $form;
}