Form action na iny presenter

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

Zdravim komunitu! :) Mam na Vas otazku: Mam teamPresenter a invitationPresenter. Ak volam teamPresenter::renderShow – zobrazia sa clenovia teamu + tam chcem mat formular ktory bude dalsich clenov pridavat AVSAK po uspesnom odoslani by som chcel volat invitationPresenter::sendInvitations – kde sa bude rozhodovat ci je alebo nieje zaregistrovana dana emailova adresa, odosielat pozvanky atd…

Vie mi niekto poradit ako spravne na to? Uz som to totiz spravil ale v invitationPresenter::sendInvitations som si data s formularu musel getPost-ovat a teda znova validovat co mi neprislo ako stastne riesenie…

Form v teamPresenter: (Naschval som v kode nechal aj moje pokusy)

protected function createComponentAddTeamMemberForm() {

    $form = new Nette\Application\UI\Form;
    // $form = new Nette\Forms\Form;

    // $form->setAction($this->link("Invitation:SendInvitations"));

    $form->addText('email', 'Emailové adresy:');

    $form->addSubmit('send', 'Pridaj!')
        ->setAttribute('class', 'btn btn-primary');

    $form->onSuccess[] = ??? ;

    return $form;
}

Editoval MarekR (19. 11. 2014 14:24)

amik
Člen | 118
+
+2
-

Form action nech raději spát. Udělej to takhle:

class TeamPresenter extends Nette\Application\UI\Presenter {

	protected $invitationSender;

	public function injectInvitationSender(MyInvitationSender $sender) {
		$this->invitationSender = $sender;
	}

	protected function createComponentAddTeamMemberForm() {
		... //vytvoření formu
		$form->onSuccess[] = function(Nette\Application\UI\Form $form) {
			// tady udělej všechno, co s odesláním formuláře souvisí,
			//přidání mailu do databáze, zaslání pozvánky atd...
			$this->invitationSender->sendTo($form->values['email']);
			$this->redirect('success'); //odeslání formu je vlastně handle signálu,
			//po každém handle signálu bys měl přesměrovat - třeba na stránku "úspěch"

		  	//pozn. příklad pro PHP 5.4 - ve verzi 5.3 nebude v anonymní funkci
			//fungovat $this a odkaz na presenter se musí předat jinak, schválně
			//to sem ale nepíšu, PHP 5.3 skončila podpora a tahle ošklivost
			//by mohla pomalu mizet ze světa.
	}
}

V presenteru nikdy nevoláš metody ani akce jiného presenteru, to je špatný návrh aplikace.
Na odeslání pozvánky bys měl mít nějakou samostatnou třídu (ideálně service zaregistrovatnou v DI kontejneru), kterou si do presenteru napojíš. Až potom provedeš přesměrování na jinou stránku, ať už jen jiný pohled nebo celý jiný presenter.