IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

9. diel - Jednoduchý redakčný systém v Symfony - Kontaktný formulár

V minulej lekcii, Jednoduchý redakčný systém v Symfony - Administrácia , sme rozpracovali administráciu. Dnes ju spolu s kontaktným formulárom dokončíme.

Model

Opäť začneme pekne od modelu.

Src / Entity / ContactMessage.php

Najskôr vytvoríme entitu reprezentujúci správu z kontaktného formulára, na ktoré ho potom postavíme. Vyzerať bude takto:

<?php

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

/**
 * Reprezentuje kontaktní emailovou zprávu.
 * @package App\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 null|string email odesílatele
     */
    public function getEmail(): ?string
    {
        return $this->email;
    }

    /**
     * Setter pro email odesílatele.
     * @param string $email email odesílatele
     * @return ContactMessage sebe
     */
    public function setEmail(string $email): self
    {
        $this->email = $email;
        return $this;
    }

    /**
     * Getter pro obsah zprávy.
     * @return null|string obsah zprávy
     */
    public function getMessage(): ?string
    {
        return $this->message;
    }

    /**
     * Getter pro obsah zprávy.
     * @param string $message obsah zprávy
     * @return ContactMessage sebe
     */
    public function setMessage(string $message): self
    {
        $this->message = $message;
        return $this;
    }
}

Kontrolér

Ďalej si vytvoríme nový kontrolér pre kontaktnú stránku.

Src / Controller / ContactContro­ller.php

Predvolené akcie pre vykreslenie kontaktné stránky s formulárom bude vyzerať nasledovne:

<?php

namespace App\Controller;

use App\Entity\ContactMessage;
use Swift_Mailer;
use Swift_Message;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints\EqualTo;
use Symfony\Component\Validator\Constraints\NotBlank;

/**
 * Kontroler pro kontaktní formulář.
 * @package App\Controller
 */
class ContactController extends AbstractController
{
    /**
     * Vytváří a zpracovává kontaktní formulář.
     * @param Swift_Mailer $mailer  služba pro posílání emailů
     * @param Request      $request HTTP požadavek
     * @return Response HTTP odpověď
     * @Route("/kontakt", name="contact")
     */
    public function index(Swift_Mailer $mailer, Request $request): Response
    {
        // Vytváření kontaktního formuláře pro novou zprávu.
        $contactMessage = new ContactMessage();
        $contactForm = $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í kontaktního formuláře.
        $contactForm->handleRequest($request);
        if ($contactForm->isSubmitted() && $contactForm->isValid()) {

            // Odeslání emailové zprávy.
            $mailer->send((new Swift_Message(
                'Email z webu',
                $contactMessage->getMessage(),
                'text/plain'
            ))->setFrom($contactMessage->getEmail()));

            $this->addFlash('notice', 'Email byl úspěšně odeslán.');
            return $this->redirectToRoute('contact');
        }

        return $this->render('contact/index.html.twig', ['contactForm' => $contactForm->createView()]);
    }
}

Tu si všimnite predovšetkým použitie Symfony knižnice Swift Mailer pre poslanie e-mailu po úspešnom odoslaní formulára.

Ďalej tu môžeme u kontaktného formulára vidieť pridanie anti-spamového prvku, ktorý automaticky validuje vyplnenie aktuálneho kalendárneho roka.

Konfigurácia

Config / packages / swiftmailer.yaml

Do nastavenia doplníme e-mailovú adresu, na ktorú sa majú správy z kontaktného formulára odosielať:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }

    # Email, na který se budou posílat všechny zprávy z kontaktního formuláře.
    delivery_addresses: ['[email protected]']

K správnemu odosielanie e-mailov je potrebné mať dobre nastavený mail server. Ak neviete, ako si ho nastaviť na lokálnom serveri, môžete túto funkcionalitu vyskúšať na vašom webhostingu.

Šablóny

Teraz sa môžeme presunúť na šablóny.

Templates / contact / index.html.twig

Začneme šablónou pre stránku s kontaktným formulárom:

{% extends '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>
    {# Kontaktní formulář. #}
    {{ form(contactForm) }}
{% endblock %}

Templates / administration / index.html.twig

Ďalej vytvoríme úplne samostatnú šablónu, ktorá bude len zahŕňať odkazy pre administračné rozhranie:

{% extends '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 %}

Templates / base.html.twig

A na záver šablóna pre celkový vzhľad, kde iba opäť pridáme odkazy na nové akcie:

...
<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>
...

Routovanie

Možno ste si všimli, že sme pridali šablónu administrácie bez vytvorenia príslušného kontroleru. To však nie je chyba ale zámer. Teraz to vysvetlíme a ukážeme si, ako všetko uviesť do funkčného stavu ;)

V prvom rade, routovanie v Symfony v predvolenom stave funguje podľa abecedného poradia kontrolerov a poradie metód jednotlivých akcií v nich. Preto sme aj index() v triede ArticleController nechali ako posledný, pretože "prehĺta" akúkoľvek URL a snaží sa jej namapovať na adresu článku. Tento problém sa teraz ale prenáša aj na ContactController, pretože ArticleController je v abecednom poradí skrátka vyššie.

Teda musíme zamiešať s poradím a ďalej vyriešiť už spomínanú situáciu, kedy máme šablónu pre administráciu, ktorá vlastne ani kontrolér nepotrebuje, je tzv. Statická. K tomu všetkému musíme upraviť routovanie v rámci konfigurácie, čo si teraz ukážeme.

Config / routes.yml

V konfiguračnom súbore nastavíme nasledujúce routovacie pravidlá:

administration:
    path:         /administrace
    controller:   Symfony\Bundle\FrameworkBundle\Controller\TemplateController
    defaults:
        template: administration/index.html.twig

articles:
    resource: App\Controller\ArticleController
    type: annotation

Ako vidíte, najskôr sme vyriešili routovanie šablóny pre administráciu bez existujúceho kontroléra a následne znovu definovať routovanie kontroleru článkov ako posledný v poradí, pričom je ponechané jeho pôvodného anotačního routovanie.

Gratulujem, práve vám beží jednoduché administračné rozhranie pre články v Symfony s kontaktným formulárom ako bonus. ;)

Stránka s kontaktným formulárom - Základy frameworku Symfony pre PHP

Teraz, v rámci on-line kurzu, budeme ďalej pokračovať v rozširovaní administrácie a začneme sa venovať zabezpečenia nášho webu, čo by malo vyústiť v plne funkčný prihlasovanie a registráciu užívateľov s definíciou ich práv, takže sa určite máte na čo tešiť. Konkrétne v nasledujúcej lekcii, Jednoduchý redakčný systém v Symfony - Model užívateľov , začneme rozšírením databázy a pridaním modelové vrstvy užívateľov :)


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 99x (60.36 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Jednoduchý redakčný systém v Symfony - Administrácia
Všetky články v sekcii
Základy frameworku Symfony pre PHP
Preskočiť článok
(neodporúčame)
Jednoduchý redakčný systém v Symfony - Model užívateľov
Článok pre vás napísal Jindřich Máca
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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