8. diel - Jednoduchý redakčný systém v Nette - Dokončenie administrácia
V minulej lekcii, Jednoduchý redakčný systém v Nette - Administrácia , sme rozpracovali administráciu článkov. Dnes ju spolu s kontaktným formulárom dokončíme.
Presenter
Začneme dokončením Presenter z minula.
App / CoreModule / presenters / ContactPresenter.php
Pridáme tak ešte jeden presenter pre kontaktný formulár:
<?php namespace App\CoreModule\Presenters; use App\Presenters\BasePresenter; use Nette\Application\UI\Form; use Nette\Mail\IMailer; use Nette\Mail\Message; use Nette\Mail\SendException; use Nette\Utils\ArrayHash; /** * Presenter pro kontaktní formulář. * @package App\CoreModule\Presenters */ class ContactPresenter extends BasePresenter { /** @var string Kontaktní email, na který se budou posílat emaily z kontaktního formuláře. */ private $contactEmail; /** @var IMailer Služba Nette pro odesílání emailů. */ private $mailer; /** * Konstruktor s nastavením kontaktního emailu a injektovanou Nette službou pro odesílání emailů. * @param string $contactEmail kontaktní email * @param IMailer $mailer automaticky injektovaná Nette služba pro odesílání emailů */ public function __construct($contactEmail, IMailer $mailer) { parent::__construct(); $this->contactEmail = $contactEmail; $this->mailer = $mailer; } /** * Vytváří a vrací kontaktní formulář. * @return Form kontaktní formulář */ protected function createComponentContactForm() { $form = new Form; $form->getElementPrototype()->setAttribute('novalidate', true); $form->addEmail('email', 'Vaše emailová adresa')->setRequired(); $form->addText('y', 'Zadejte aktuální rok')->setOmitted()->setRequired() ->addRule(Form::EQUAL, 'Chybně vyplněný antispam.', date("Y")); $form->addTextArea('message', 'Zpráva')->setRequired() ->addRule(Form::MIN_LENGTH, 'Zpráva musí být minimálně %d znaků dlouhá.', 10); $form->addSubmit('send', 'Odeslat'); // Funkce se vykonaná při úspěšném odeslání kontaktního formuláře a odešle email. $form->onSuccess[] = function (Form $form, ArrayHash $values) { try { $mail = new Message; $mail->setFrom($values->email) ->addTo($this->contactEmail) ->setSubject('Email z webu') ->setBody($values->message); $this->mailer->send($mail); $this->flashMessage('Email byl úspěšně odeslán.'); $this->redirect('this'); } catch (SendException $e) { $this->flashMessage('Email se nepodařilo odeslat.'); } }; return $form; } }
Tu si všimnite predovšetkým použitie Nette knižnice pre odosielanie emailov z formulára.
App / CoreModule / config / config.neon
Ďalej nesmieme zabudnúť odovzdať konfiguráciu kontaktného emailu do nášho nového prezentačného:
# # Konfigurační soubor pro CoreModule. # parameters: defaultArticleUrl: 'uvod' # URL výhozího článku contactEmail: '[email protected]' # Kontaktní email # Nastavení služeb pro CoreModule. services: # Definice vlastních služeb dále přístupných pomocí DI. - App\CoreModule\Model\ArticleManager # Předání nastavení při vytváření služeb presenterů. - App\CoreModule\Presenters\ArticlePresenter(%defaultArticleUrl%) - App\CoreModule\Presenters\ContactPresenter(%contactEmail%)
App / config / config.neon
Ak ste pozorne čítali kód, všimli ste si, že u tvorby formulárov v
metóde setRequired()
nie je vyplnená chybová hláška. To je z
toho dôvodu, že nám bude stačiť všade rovnaká a tú si globálne
nastavíme v hlavnom konfiguračnom súbore pripísaním nasledujúcich
riadkov:
... # Nastavení výchozích chybových hlášek pro formuláře. forms: messages: REQUIRED: 'Povinné pole.' EMAIL: 'Neplatná emailová adresa.' ...
App / router / RouterFactory.php
Nakoniec musíme opäť upraviť routovanie, aby naše aplikácie brala do úvahy nové Presenter a ich akcie. Ukážeme si tu tiež rovno príklad preklade slovenských URL adries na anglické názvy podujatí:
<?php namespace App; use Nette\Application\IRouter; use Nette\Application\Routers\Route; use Nette\Application\Routers\RouteList; use Nette\StaticClass; /** * Továrna na routovací pravidla. * Řídí směrování a generovaní URL adres v celé aplikaci. * @package App */ class RouterFactory { use StaticClass; /** * Vytváří a vrací seznam routovacích pravidel pro aplikaci. * @return IRouter výsledný router pro aplikaci */ public static function createRouter() { $router = new RouteList; $router[] = new Route('kontakt', 'Core:Contact:default'); $router[] = new Route('administrace', 'Core:Administration:default'); $router[] = new Route('<action>[/<url>]', [ 'presenter' => 'Core:Article', 'action' => [ Route::FILTER_STRICT => true, Route::FILTER_TABLE => [ // řetězec v URL => akce presenteru 'seznam-clanku' => 'list', 'editor' => 'editor', 'odstranit' => 'remove' ] ] ]); $router[] = new Route('[<url>]', 'Core:Article:default'); return $router; } }
Ak sa čudujete, prečo majú niektoré Presenter svojou vlastnou route, tak
je to z toho dôvodu, že potrebujeme rozlíšiť medzi URL článku a názvom
prezentačného, pretože obe majú rovnaký tvar - /presenter
vs.
/url
. V tomto prípade teda vždy dostane prednosť názov
prezentačného pred vykreslením URL článku.
Šablóny
Teraz sa môžeme pozrieť zase na šablóny (templates).
App/templates/@layout.latte
Tu len doplníme odkazy na jednotlivé Presenter a ich akcie pomocou Latte makier a pridáme odkaz na administračné rozhranie do pätičky. Nebudem sem vypisovať už znovu celú šablónu, iba vykonané zmeny:
... <ul> <li><a n:href=:Core:Article:>Úvod</a></li> <li><a n:href=:Core:Article:list>Seznam článků</a></li> <li><a n:href=:Core:Contact:>Kontakt</a></li> </ul> ... <footer> <p> Ukázkový tutoriál pro jednoduchý redakční systém v Nette z programátorské sociální sítě <a href="http://www.itnetwork.cz" target="_blank">itnetwork.cz</a>. <a n:href=:Core:Administration:>Administrace</a> </p> </footer> ...
App / CoreModule / templates / Article / list.latte
Pridáme si šablónu pre výpis zoznamu článkov:
{block title}Výpis článků{/block} {block description}Výpis všech článků.{/block} {block content} <table> <tr n:foreach="$articles as $article"> <td> <h2><a n:href="Article: $article->url">{$article->title}</a></h2> {$article->description} <br> <a n:href="editor $article->url">Editovat</a> <a n:href="remove $article->url">Odstranit</a> </td> </tr> </table>
App / CoreModule / templates / Article / editor.latte
Ďalej pridáme šablónu pre editor článkov. Tu si všimnite ako jednoducho sme zariadili vykreslenie formulára a tiež spôsobu pridávanie ďalších JavaScript knižníc:
{block title}Editor{/block} {block description}Editor článků.{/block} {block content} {* Formulář pro editaci. *} {control editorForm} {/block} {block scripts} {include parent} <script type="text/javascript" src="//cdn.tinymce.com/4/tinymce.min.js"></script> <script type="text/javascript"> tinymce.init({ selector: 'textarea[name=content]', plugins: [ 'advlist autolink lists link image charmap print preview anchor', 'searchreplace visualblocks code fullscreen', 'insertdatetime media table contextmenu paste' ], toolbar: 'insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image', entities: '160,nbsp', entity_encoding: 'raw' }); </script> {/block}
App / CoreModule / templates / Administration / default.latte
Nasleduje šablóna pre administračné rozhranie:
{block title}Administrace webu{/block} {block description}Administrace webu.{/block} {block content} <p>Vítejte v administraci!</p> <h2><a n:href=Article:editor>Editor článků</a></h2> <h2><a n:href=Article:list>Seznam článků</a></h2>
App / CoreModule / templates / Contact / default.latte
A na záver šablóna pre stránku s kontaktným formulárom:
{block title}Kontaktní formulář{/block} {block description}Kontaktní formulář.{/block} {block content} <p>Kontaktujte nás odesláním formuláře níže.</p> {* Formulář pro kontakt. *} {control contactForm}
Gratulujem, práve vám beží jednoduché administračné rozhranie pre články v Nette s kontaktným formulárom ako bonus.
Teraz v rámci kurzu budeme 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 Nette - Model užívateľov , začneme rozšírením databázy a pridaním modelu 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é 848x (3.66 MB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP