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áhnout 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');
}
Vylepšit tuto stránku