Vytváříme kontaktní formulář

Vytvoření kontaktního formuláře s odesláním na mail – formou raw textuhtml šablonou.

Návod staví nad sandboxem Nette 2.0.8 a PHP 5.3+. Stačí jej stáhout a upravovat konkrétní soubory.

Jednoduše v presenteru

Nejjednodušší a nejrychlejší přístup je vytvoření formuláře v presenteru – vytvoříme tedy komponentu ContactForm. Dále přidáme její zpracování třídou Nette\Mail\Message, která má na starosti vytváření a odesílání emailů. Více o odesílání emailů si můžete přečíst v dokumentaci.

presenters/HomepagePresenter.php

use Nette\Application\UI\Form;
use Nette\Mail\Message;

class HomepagePresenter extends BasePresenter
{

    /**
     * Contact form
     */
    protected function createComponentContactForm()
    {
        $form = new Form;
        $form->addText('name', 'Jméno:')
            ->addRule(Form::FILLED, 'Zadejte jméno');
        $form->addText('email', 'Email:')
            ->addRule(Form::FILLED, 'Zadejte email')
            ->addRule(Form::EMAIL, 'Email nemá správný formát');
        $form->addTextarea('message', 'Zpráva:')
            ->addRule(Form::FILLED, 'Zadejte zprávu');
        $form->addSubmit('send', 'Odeslat');

        $form->onSuccess[] = [$this, 'processContactForm'];

        return $form;
    }


    /**
     * Process contact form, send message
     * @param Form
     */
    public function processContactForm(Form $form)
    {
        $values = $form->getValues(true);

        $message = new Message;
        $message->addTo('test@gmail.com')
            ->setFrom($values['email'])
            ->setSubject('Zpráva z kontaktního formuláře')
            ->setBody($values['message'])
            ->send();

        $this->flashMessage('Zpráva byla odeslána');
        $this->redirect('this');
    }

}

Takto vytvořenou komponentu poté stačí přidat do šablony a můžeme vesele kontaktovat.

templates/Homepage/default.latte

{block #content}

{control contactForm}

Html šablona emailu

Pokud chceme v emailu využít html, musíme použít vlastní šablonu. V ní definujeme proměnné (ty jí musíme předat) a předmět v tagu <title>. Šablonu umístíme např. do:

templates/email/emailTemplate.latte

<html>
    <head>
        <title>{$title}</title>
    </head>

    <body>
        <ul>
            <li>
                <strong>Jméno:</strong> {$values['name']}
            </li>
            <li>
                <strong>Email:</strong> {$values['email']}
            </li>
            <li>
                <strong>Zpráva:</strong> {$values['message']}
            </li>
        </ul>

    </body>
</html>

Ještě upravíme metodu pro zpracování formuláře.

presenters/HomepagePresenter.php

/**
 * Process contact form, send message with custom template
 * @param Form
 */
public function processContactForm(Form $form)
{
    $values = $form->getValues(true);

    $message = new Message;
    $message->addTo('test@gmail.com')
        ->setFrom($values['email']);

    $template = $this->createTemplate();
    $template->setFile(__DIR__ . '/../templates/emails/emailTemplate.latte');
    $template->title = 'Zpráva z kontaktního formuláře';
    $template->values = $values;

    $message->setHtmlBody($template)
        ->send();

    $this->flashMessage('Zpráva byla odeslána');
    $this->redirect('this');
}