Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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ář

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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/En­tity/ContactMes­sage.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/Re­sources/config/pa­rameters.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/pa­rameters.yml

Kontroler

Vytvoříme si nový kontroler pro kontaktní stránku.

src/AppBundle/Con­troller/Contac­tController.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/vi­ews/Contact/in­dex.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/vi­ews/Administra­tion/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/vi­ews/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/vi­ews/Administra­tion/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/rou­ting.yml

Nejdříve opět přeneseme konfiguraci routování do našeho AppBundlu:

app:
    resource: [email protected]/Resources/config/routing.yml'

src/AppBundle/Re­sources/config/rou­ting.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: [email protected]/Resources/views/Administration/index.html.twig'

article:
    resource: [email protected]/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. ;)

Stránka s kontaktním formulářem

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 začneme rozšířením databáze a přidáním modelové vrstvy uživatelů. :)


 

Stáhnout

Staženo 10x (11.62 MB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal Jindřich Máca
Avatar
Jak se ti líbí článek?
3 hlasů
Autor se věnuje převážně webovým technologiím, ale má velkou zálibu ve všem vědeckém, nejen ze světa IT. :-)
Aktivity (6)

 

 

Komentáře

Avatar
Marek Pastorek:7. července 15:17

Zdravim,

chcem sa spytat, nema byt v ContactControllery namiesto ->setBody($con­tactMessage->getEmail() pouzita funkcia getMessage()?
Inak velmi dobry serial.

 
Odpovědět 7. července 15:17
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Marek Pastorek
Jindřich Máca:7. července 17:38

Zdravím,

samozřejmě máš pravdu, chybička se vloudila. :D Hned to opravím. ;)

P.S.: Jsem rád, že se seriál líbí. :)

 
Odpovědět 7. července 17:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.