9. díl - Jednoduchý redakční systém v Symfony - Kontaktní formulář
PHP Symfony Základy Jednoduchý redakční systém v Symfony - Kontaktní formulář


V minulé lekci, Jednoduchý redakční systém v Symfony - Administrace, jsme rozpracovali administraci. Dnes ji spolu s kontaktním formulářem dokončíme.
Model
Opět začneme hezky od modelu.
src/AppBundle/Entity/ContactMessage.php
Nejdříve vytvoříme entitu reprezentující zprávu z kontaktního formuláře, na které ho poté postavíme. Vypadat bude takto:
<?php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Reprezentuje kontaktní emailovou zprávu.
* @package AppBundle\Entity
*/
class ContactMessage
{
/**
* @var string Emailová adresa odesílatele.
* @Assert\NotBlank(message = "Emailová adresa nemůže být prázdná!")
* @Assert\Email(message="'{{ value }}' není validní emailová adresa!")
*/
private $email;
/**
* @var string Obsah zprávy.
* @Assert\NotBlank(message = "Obsah zprávy nemůže být prázdný!")
* @Assert\Length(min=10, minMessage="Zpráva musí být minimálně {{ limit }} znaků dlouhá!")
*/
private $message;
/**
* Getter pro email odesílatele.
* @return string email odesílatele
*/
public function getEmail()
{
return $this->email;
}
/**
* Setter pro email odesílatele.
* @param string $email email odesílatele
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* Getter pro obsah zprávy.
* @return string obsah zprávy
*/
public function getMessage()
{
return $this->message;
}
/**
* Getter pro obsah zprávy.
* @param string $message obsah zprávy
*/
public function setMessage($message)
{
$this->message = $message;
}
}
Konfigurace
src/AppBundle/Resources/config/parameters.yml
Do nastavení doplníme e-mailovou adresu, na kterou se mají zprávy z kontaktního formuláře odesílat:
# Nastavení parametrů konfigurace.
parameters:
default_article_url: uvod # URL výchozího článku.
contact_email: '[email protected]' # Email, na který se budou posílat emaily z kontaktního formuláře.
Pozn.: Ke správnému odesílání e-mailů je potřeba mít dobře nastavený mail server a vyplněné příslušné přístupové údaje v app/config/parameters.yml
Kontroler
Vytvoříme si nový kontroler pro kontaktní stránku.
src/AppBundle/Controller/ContactController.php
Výchozí akce pro vykreslení kontaktní stránky s formulářem bude vypadat následovně:
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\ContactMessage;
use Swift_Message;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Constraints\EqualTo;
use Symfony\Component\Validator\Constraints\NotBlank;
/**
* Zpracovává kontaktní formulář.
* @package AppBundle\Controller
*/
class ContactController extends Controller
{
/**
* Vytváří a vykresluje kontaktní formulář.
* @param Request $request HTTP požadavek
* @return Response HTTP odpověď
*/
public function indexAction(Request $request)
{
$contactMessage = new ContactMessage();
/** @var Form $form Kontaktní formulář. */
$form = $this->createFormBuilder($contactMessage)
->add('email', null, ['label' => 'Vaše emailová adresa'])
->add('y', TextType::class, [
'label' => 'Zadejte aktuální rok',
'mapped' => false,
'constraints' => [
new NotBlank(['message' => 'Pole pro aktuální rok nemůže být prázdné!']),
new EqualTo(['value' => date("Y"), 'message' => 'Chybně vyplněný antispam!'])
]
])
->add('message', TextareaType::class, ['label' => 'Zpráva'])
->add('submit', SubmitType::class, ['label' => 'Odeslat'])
->getForm();
// Zpracování formuláře.
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Odeslání emailové zprávy.
$this->get('mailer')->send(Swift_Message::newInstance()
->setSubject('Email z webu')
->setFrom($contactMessage->getEmail())
->setTo($this->getParameter('contact_email'))
->setBody($contactMessage->getMessage(), 'text/plain'));
$this->addFlash('notice', 'Email byl úspěšně odeslán.');
return $this->redirectToRoute('contact');
}
return $this->render('AppBundle:Contact:index.html.twig', [
'form' => $form->createView()
]);
}
}
Zde si povšimněte především použití Symfony rozhraní pro odesílání e-mailů při úspěšném odeslání formuláře.
Dále zde můžeme u kontaktního formuláře vidět přidání anti-spamového prvku, který automaticky validuje vyplnění aktuálního kalendářního roku.
Šablony
Nyní se můžeme opět podívat na šablony.
src/Resources/views/Contact/index.html.twig
Začneme šablonou pro stránku s kontaktním formulářem:
{% extends 'AppBundle::base.html.twig' %}
{% block title %}Kontaktní formulář{% endblock %}
{% block description %}Kontaktní formulář.{% endblock %}
{% block body %}
<p>Kontaktujte nás odesláním formuláře níže.</p>
{# Formulář pro kontakt. #}
{% form_theme form 'AppBundle:Form:row.html.twig' %}
{{ form(form) }}
{% endblock %}
src/Resources/views/Administration/index.html.twig
Dále vytvoříme úplně samostatnou šablonu, která bude pouze zahrnovat odkazy pro administrační rozhraní:
{% extends 'AppBundle::base.html.twig' %}
{% block title %}Administrace webu{% endblock %}
{% block description %}Administrace webu.{% endblock %}
{% block body %}
<p>Vítejte v administraci!</p>
<h2><a href="{{ path('article_editor') }}">Editor článků</a></h2>
<h2><a href="{{ path('article_list') }}">Seznam článků</a></h2>
{% endblock %}
src/Resources/views/base.html.twig
A na závěr šablona pro celkový vzhled, kde pouze zas přidáme odkazy na nové akce:
...
<ul>
<li><a href="{{ path('homepage') }}">Úvod</a></li>
<li><a href="{{ path('article_list') }}">Seznam článků</a></li>
<li><a href="{{ path('contact') }}">Kontakt</a></li>
</ul>
...
<footer>
<p>
Ukázkový tutoriál pro jednoduchý redakční systém v Symfony z programátorské sociální sítě
<a href="http://www.itnetwork.cz" target="_blank">itnetwork.cz</a>.
<a href="{{ path('administration') }}">Administrace</a>
</p>
</footer>
...
Routování
Možná jste si všimli, že jsme přidali šablonu administrace bez
vytvoření příslušného kontroleru a ti bystřejší zaregistrovali, že ani
akce kontaktního kontroleru nemá přidělené v anotaci žádné routování.
Ani jedno však není chyba nýbrž záměr. Nyní jsi to vysvětlíme a
ukážeme si, jak vše uvést do funkčního stavu
V první řadě routování v Symfony ve výchozím stavu funguje podle
abecedního pořadí kontrolerů a pořadí metod jednotlivých akcí v nich.
Proto jsme i indexAction()
v třídě
ArticleController
nechali jako poslední, protože "polyká"
jakoukoliv URL a snaží se jí namapovat na adresu článku. Tento problém se
teď ale přenáší i na ContactController
, protože
ArticleController
je v abecedním pořadí zkrátka výše.
Tudíž musíme zamíchat s pořadím a dále vyřešit situaci, kdy máme šablonu src/Resources/views/Administration/index.html.twig, která vlastně ani kontroler nepotřebuje, je tzv. statická. K tomu všemu musíme upravit konfiguraci routování, což jsi nyní ukážeme.
app/config/routing.yml
Nejdříve opět přeneseme konfiguraci routování do našeho AppBundlu:
app:
resource: '@AppBundle/Resources/config/routing.yml'
src/AppBundle/Resources/config/routing.yml
Poté už v nově vytvořeném konfiguračním souboru nastavíme routovací pravidla dle libosti:
# Nastavení routovacích pravidel.
contact:
path: /kontakt
defaults: { _controller: AppBundle:Contact:index }
administration:
path: /administrace
defaults:
_controller: FrameworkBundle:Template:template
template: '@AppBundle/Resources/views/Administration/index.html.twig'
article:
resource: '@AppBundle/Controller/ArticleController.php'
type: annotation
Jak vidíte, nejdříve jsme přehodili pořadí routování a dále si můžete všimnou:
- Alternativního routování k anotacím u kontaktního kontroleru.
- Routování šablony bez existujícího kontroleru u stránky pro administraci.
- Ponechání původního anotačního routování u kontroleru článků.
Gratuluji, právě vám běží jednoduché administrační rozhraní pro
články v Symfony s kontaktním formulářem jako bonus.

Nyní, v rámci on-line kurzu, budeme dále pokračovat v rozšiřování
administrace a začneme se věnovat zabezpečení našeho webu, což by mělo
vyústit v plně funkční přihlašování a registraci uživatelů s definicí
jejich práv, takže se určitě máte na co těšit. Konkrétně v příští
lekci, Jednoduchý redakční systém v Symfony - Model uživatelů, začneme rozšířením databáze a přidáním modelové vrstvy
uživatelů
Stáhnout
Staženo 25x (11.62 MB)
Aplikace je včetně zdrojových kódů v jazyce PHP
Komentáře
Zobrazeno 2 zpráv z 2.