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 / ContactController.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.
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é 102x (60.36 kB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP