Dokonalý kontaktní formulář za 10 minut | Ondřej Mirtes

Dokonalý kontaktní formulář za 10 minut | Ondřej Mirtes

ČTVRTEK
17. 9. 2009
Dokonalý kontaktní formulář za 10 minut

Nette Framework má mnoho předností. Hlavní z nich je rychlá a efektivní tvorba kvalitních webových aplikací.

Už dávno jsou ty doby, kdy jsem v PHP půl odpoledne patlal obstojný formulář s kontrolou vyplněných textových polí, validitou e-mailové adresy a jakž-takž ucházejícím vzhledem odesílané zprávy.

V Nette je tvorba dokonalého a neprůstřelného kontaktního formuláře práce na 10 minut. Framework totiž obsahuje třídu jak pro práci s formuláři, tak třídu pro odeslání e-mailu (včetně podpory tvorby zprávy šablonovým způsobem).


Jak vypadá zdrojový kód takového formuláře? Vytvoříme si ho v továrničcePresenteru:

protected function createComponentContactForm() {
                $form = new BaseForm;

                $form->addText('name', 'Vaše jméno')
                        ->addRule(Form::FILLED, 'Vyplňte vaše jméno');

                $form->addText('email', 'Váš e-mail')
                        ->setEmptyValue('@')
                        ->addRule(Form::FILLED, 'Vyplňte váš e-mail')
                        ->addRule(Form::EMAIL, 'E-mail má nesprávný tvar');

                $form->addTextarea('text', 'Zpráva')
                        ->addRule(Form::FILLED, 'Vyplňte zprávu');

                $form->addSubmit('okSubmit', 'Odeslat');

                $form->onSubmit[] = array($this, 'contactFormSubmitted');

                return $form;
        }

Jednoduchým zavoláním makra widget vykreslíme formulář v té šabloně, kde ho chceme:

{widget contactForm}

Napíšeme metodu, která se při odeslání formuláře zavolá (a dbáme při tom na pattern Post/Redirect/Get):

public function contactFormSubmitted(BaseForm $form) {
                try {
                        $this->sendMail($form->getValues());
                        $this->flashMessage('Zpráva úspěšně odeslána!');
                        $this->redirect('this');
                } catch (IOException $e) {
                        $form->addError($e->getMessage());
                }
        }

Napíšeme samotné odeslání e-mailu (včetně plnění souboru se šablonou):

private function sendMail($values) {
                $mail = new Mail;

                $mail->setSubject('Nová zpráva z kontaktního formuláře');
                $mail->setFrom($values['email'], $values['name']);
                $mail->addTo('ondrej@mirtes.cz', 'Ondřej Mirtes');

                $template = $this->createTemplate();
                $template->setFile(Environment::getVariable('templatesDir') . '/Mail.phtml');

                $template->name = $values['name'];
                $template->email = $values['email'];
                $template->text = $values['text'];

                $mail->setHtmlBody($template);

                try {
                        $mail->send();
                } catch (InvalidStateException $e) {
                        throw new IOException('Nepodařilo se odeslat e-mail, zkuste to prosím za chvíli.');
                }
        }

A vytvoříme šablonu, jak bude e-mail vypadat (Mail.phtml):

<h3>Nová zpráva z kontaktního formuláře</h3>

<ul>
        <li><strong>Jméno</strong> {$name}</li>
        <li><strong>E-mail</strong> <a href="mailto:{$email}">{$email}</a></li>
</ul>

<h4>Text zprávy</h4>

{!$text |texy}

To je celé. Máme formulář, který se neodešle, pokud nejsou vyplněna všechna povinná pole (včetně klientské validace Javascriptem), u kterého nebude hrozit vícenásobné odeslání pomocí F5 a který by nám zabral daleko více času, kdybychom se ho snažili vytvořit bez frameworku.


P.S. Vložit tento článek do mého CMS (tento blog jsem programoval půl roku před tím, než jsem začal s Nette dělat) se ukázalo jako daleko náročnější, než tvorba celého formuláře – neescapuje mi správně znaky (vyřešilo by dibi) a neobarví mi PHP kód (vyřešilo by Texy!). Davide, co bychom bez tebe dělali? :)

P.P.S. Začátkem října jsem celý blog přepsal do Nette, dibi a Texy, takže přesun článku a obarvení kódu v novém systému bylo daleko pohodlnější :)

Literatura k nastudování

Ondřej Mirtes

Komentáře RSS

Přidat nový komentář
 

[1] Patrik Votoček (Vrtak-CZ) | 17. 9. 2009 19:28

PR: SMTP posílání e-mailu pro Nette http://www.vrtak-cz.net/…ndmailmailer

[2] Inza | 17. 9. 2009 20:17

Co takhle to přidat do extras? Pls…

[3] Ondřej Mirtes | 17. 9. 2009 21:13

To bylo na mě nebo na Patrika?

[4] rokerkony | 17. 9. 2009 22:01

jen takovej dotaz nemelo by byt v metode contactFormSubmitted(BaseForm $form) { } zavolani flash zpravy pred redirectem? takhle se dle meho neodesle :-) jinak super clanek :-)

[5] Sparky | 17. 9. 2009 22:05

mám emalový formulář v PHP IDE asi na 12 řádků i z kontrolou a českýma znakama.. zdá se mi toto řešení zbytečné.. jen se člověk musí učit další „klikiháky“ v programování :)

VK (aká Sparky) – kolega z Felu

[6] Warden | 17. 9. 2009 23:12

Ano neodešle, nejdřív má být nastavení flashMessage() a až po tom redirect. Jinak je to moc pěkné :-)

[7] Ondřej Mirtes | 18. 9. 2009 10:44

Už jsem to opravil, byla to samozřejmě moje chyba. Nevšiml jsem si, že mi tam při odeslání ta zprávička chybí :)

[8] kolemjdoucí | 25. 12. 2009 21:10

Zdravím! V úvodním kódu ti Ondro nejspíše vypadlo „public functin“, jinak super. :-)

[9] Ondřej Mirtes | 25. 12. 2009 22:45

[8]: protected function se někam vytratilo, opravím, díky :)

[10] xfyg | 7. 9. 2010 22:23

s\dfysd

[11] Ondra | 14. 10. 2010 18:53

super!!!

[12] 41536 | 28. 8. 2011 22:34

15345332

[13] cvb | 19. 11. 2011 10:08

vcb

[14] ja | 16. 12. 2011 20:58

ss

Info

Ondřej Mirtes

23 let

student ČVUT FEL
& webový vývojář

počítače, hry, DJing

Foto

Včera: @jantichy I've met some gentle people there…

Včera: Vždy, když mi volá blokované číslo, čekám na druhé straně Sadako Yamamurovou, která mi řekne, že do týdne zemřu.

Včera: Po shlédnutí Půlnoci v Paříži jsem tomu městu odpustil i vykradené auto. Chci se tam co nejdřív vrátit!

Včera: I have a feeling we're not in Kansas anymore. http://t.co/7BB51eKC

Před 9 dny: January 28th 2012 http://t.co/LsYUNvNm

Anketa

Rubriky

Top 5 za únor 2009

  • 1. The Doppler Effect – Beauty Hides In The Deep (The Blizzard Remix)
  • 2. Nifra – Complicated Life
  • 3. Will Holland – Tears In The Rain
  • 4. Myon & Shane 54 ft. Carrie Skipper – Vampire
  • 5. Rank1 – L.E.D. There Be Light

Winamp mi právě hraje

  • 112d Thomas Coastline & CrossRyders – Global Electronic Music Sessions 044 on AH.FM
  • 112d Next on Air: Eunostos – Club Nights 032 on AH.FM
  • 112d Thomas Coastline & CrossRyders – Global Electronic Music Sessions 044 on AH.FM
  • 112d Sean Tyas – Tytanium Sessions 116 on AH.FM
  • 112d Ferry Tayle – Flightbook Bratislava Edition on AH.FM
* * * * * * * * * * * * *