Form action na iny presenter
- MarekR
- Člen | 17
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
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.