Nette Documentation Preview

syntax
Vytváříme kontaktní formulář
****************************

.[warning]
Tato stránka je již zastaralá a návod nemusí být funkční.

.[perex]
Vytvoření kontaktního formuláře s odesláním na mail - formou **raw textu** i **html šablonou**.

.[note]
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|api: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|doc:cs:mail/@home].


**presenters/HomepagePresenter.php**

```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**

```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**

```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**


```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');
}
```








/--comment


Jako komponenta
===============

Email s šablonou v komponentě


Šikovná komponenta
------------------

Formuláře je vhodné pro přehlednost a lepší rozšiřitelnost umisťovat do samostatné složky, např. `app/Forms`. Jelikož v tomto návodu bude potřeba vytváření šablon, využijeme k tomu samostatnou komponentu, kterou umístíme do `app/Components`.

Zde vytvoříme složku `ContactFormControl` a v ní soubory:

**ContactFormControl.php**

/-php
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use Nette\Mail\Message;

class ContactFormComponent extends Control
{

	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;
	}


	public function processContactForm(Form $form)
	{
		$settings = $this->presenter->context->parameters['email'];
		$values = $form->values;

		$message = new Message;
		$message->addTo($settings['to'])
			->setFrom($values['email']);

		// 1. způsob - raw text
		$message->setSubject($settings['subject'])
			->setBody($values['message']);

		// 2. způsob - html
		$template = $this->createTemplate();
		$template->setFile(__DIR__ . '/emailTemplate.latte');
		$template->title = $settings['subject'];
		$template->values = $values;
		$message->setHtmlBody($template);

		$message->send();

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


	public function render()
	{
		$this->template->setFile(__DIR__ . '/ContactFormControl.latte');
		$this->template->render();
	}

}



**ContactFormControl.latte**
/-html
{control contactForm}


**emailTemplate.latte**
/-html
<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>
\-


Presenter
---------

Poté formulář zavoláme v presenteru a vytvoříme komponentu:

**HomepagePresenter.php**

```php
class HomepagePresenter extends BasePresenter
{

	protected function createComponentContactFormControl()
	{
		return new ContactFormComponent;
	}


}

```


Šablona
-------

Komponentu přidáme do šalbony:

**Homepage/default.latte**
```latte
{block content}
	{control contactFormControl}
{/block}
```


Config
------

**app/config/config.neon**
```neon
parameters:
	email:
		to: my@email.com
		subject: Kontaktní formulář
```


SMTP odesílání?
---------------

Link někam, toto už tu je...

\--


{{author: newPOPE|2127}}

Vytváříme kontaktní formulář

Tato stránka je již zastaralá a návod nemusí být funkční.

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');
}