IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Jednoduchý redakčný systém v Nette - Administrácia

V minulej lekcii, Jednoduchý redakčný systém v Nette - Výpis článku , sme už vytvorili základnú štruktúru pre výpis článkov okrem šablón, ktoré dnes pridáme. Tým výpis sprevádzkujeme a budeme pokračovať s tvorbou ich administrácie.

Šablóny

Teraz je teda čas pozrieť sa na zúbok šablónam (templates). Opäť tu môžeme zmazať celú zložku app/templates/Homepage/, pretože rovnako ako triedu HomepagePresenter ju už nebudeme ďalej potrebovať.

App/templates/@la­yout.latte

Samozrejme nezačneme ničím iným ako úpravou celkového vzhľadu našej aplikácie, ktorý v tomto prípade zaisťuje Latte šablóna @layout.latte, opäť predpripravená v sandboxe, z ktorého vychádzame.

{**
 * @param string   $basePath web base path
 * @param array    $flashes  flash messages
 *}
<!DOCTYPE html>
<html lang="cs">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="description" content="{include description|striptags}">

        <title>{include title|striptags}</title>

        {block css}
            <link rel="stylesheet" href="{$basePath}/css/style.css">
        {/block}

        {block head}{/block}
    </head>

    <body>
        <header>
            <h1>Jednoduchý redakční systém v Nette</h1>
        </header>

        {* Výpis flash zpráv. *}
        <p n:foreach="$flashes as $flash" class="message">{$flash->message}</p>

        <nav>
            <ul>
                <li><a n:href=:Core:Article:>Úvod</a></li>
                <li><a href="#">Seznam článků</a></li>
                <li><a href="#">Kontakt</a></li>
            </ul>
        </nav>
        <br clear="both">

        <article>
            <header>
                <h1>{include title}</h1>
            </header>
            <section>
                {include content} {* Vložení obsahu do šablony. *}
            </section>
        </article>

        <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>
            </p>
        </footer>

        {block scripts}
            <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
            <script src="{$basePath}/js/main.js"></script>
        {/block}
    </body>
</html>

App / CoreModule / templates / Article / default.latte

Nakoniec vytvoríme zložku Article/ pre šablóny nášho ArticlePresenter v CoreModule a do nej pridáme súbor default.latte ako šablónou pre jeho predvolenú akciu renderDefault(). Samotná šablóna je relatívne jednoduchá:

{block title}{$article->title}{/block}
{block description}{$article->description}{/block}
{block content}
{$article->content|noescape}

Teraz si už môžete skúsiť web spustiť a mali by ste vidieť úvodnú stránku. Je to určite príjemný pocit po tom, čo sme zmenili toľko kódu, že? :)

Úvodná stránka redakčného systému v Nette frameworku - Základy Nette frameworku

Úplný základ máme sprevádzkovaný, teraz sa pozrieme hlbšie do CoreModule a to konkrétne na administráciu článkov ;)

Presenter

Model máme už nachystaný z minula, takže začneme rovno od Presenter.

App / CoreModule / presenters / ArticlePresen­ter.php

Keďže v Nette môžeme mať viac podujatí v jednom prezentačného, budeme pokračovať v rozširovaní našej triedy ArticlePresenter a pridáme do nej nasledujúce metódy ďalších akcií:

<?php

namespace App\CoreModule\Presenters;

use App\CoreModule\Model\ArticleManager;
use App\Presenters\BasePresenter;
use Nette\Application\AbortException;
use Nette\Application\BadRequestException;
use Nette\Application\UI\Form;
use Nette\Database\UniqueConstraintViolationException;
use Nette\Utils\ArrayHash;

/**
 * Presenter pro akce s články.
 * @package App\CoreModule\Presenters
 */
class ArticlePresenter extends BasePresenter
{
    /** @var string URL výchozího článku. */
    private $defaultArticleUrl;

    /** @var ArticleManager Model pro správu s článků. */
    private $articleManager;

    /**
     * Konstruktor s nastavením URL výchozího článku a injektovaným modelem pro správu článků.
     * @param string         $defaultArticleUrl URL výchozího článku
     * @param ArticleManager $articleManager    automaticky injektovaný model pro správu článků
     */
    public function __construct($defaultArticleUrl, ArticleManager $articleManager)
    {
        parent::__construct();
        $this->defaultArticleUrl = $defaultArticleUrl;
        $this->articleManager = $articleManager;
    }

    /**
     * Načte a předá článek do šablony podle jeho URL.
     * @param string|null $url URL článku
     * @throws BadRequestException Jestliže článek s danou URL nebyl nalezen.
     */
    public function renderDefault($url = null)
    {
        if (!$url) $url = $this->defaultArticleUrl; // Pokud není zadaná URL, vezme se URL výchozího článku.

        // Pokusí se načíst článek s danou URL a pokud nebude nalezen vyhodí chybu 404.
        if (!($article = $this->articleManager->getArticle($url)))
            $this->error(); // Vyhazuje výjimku BadRequestException.

        $this->template->article = $article; // Předá článek do šablony.
    }

    /** Načte a předá seznam článků do šablony. */
    public function renderList()
    {
        $this->template->articles = $this->articleManager->getArticles();
    }

    /**
     * Odstraní článek.
     * @param string|null $url URL článku
     * @throws AbortException
     */
    public function actionRemove($url = null)
    {
        $this->articleManager->removeArticle($url);
        $this->flashMessage('Článek byl úspěšně odstraněn.');
        $this->redirect('Article:list');
    }

    /**
     * Vykresluje formulář pro editaci článku podle zadané URL.
     * Pokud URL není zadána, nebo článek s danou URL neexistuje, vytvoří se nový.
     * @param string|null $url URL adresa článku
     */
    public function actionEditor($url = null)
    {
        if ($url) {
            if (!($article = $this->articleManager->getArticle($url)))
                $this->flashMessage('Článek nebyl nalezen.'); // Výpis chybové hlášky.
            else $this['editorForm']->setDefaults($article); // Předání hodnot článku do editačního formuláře.
        }
    }

    /**
     * Vytváří a vrací formulář pro editaci článků.
     * @return Form formulář pro editaci článků
     */
    protected function createComponentEditorForm()
    {
        // Vytvoření formuláře a definice jeho polí.
        $form = new Form;
        $form->addHidden('article_id');
        $form->addText('title', 'Titulek')->setRequired();
        $form->addText('url', 'URL')->setRequired();
        $form->addText('description', 'Popisek')->setRequired();
        $form->addTextArea('content', 'Obsah');
        $form->addSubmit('save', 'Uložit článek');

        // Funkce se vykonaná při úspěšném odeslání formuláře a zpracuje zadané hodnoty.
        $form->onSuccess[] = function (Form $form, ArrayHash $values) {
            try {
                $this->articleManager->saveArticle($values);
                $this->flashMessage('Článek byl úspěšně uložen.');
                $this->redirect('Article:', $values->url);
            } catch (UniqueConstraintViolationException $e) {
                $this->flashMessage('Článek s touto URL adresou již existuje.');
            }
        };

        return $form;
    }
}

Tu by som upozornil predovšetkým na spôsob odovzdávania východiskových hodnôt do editačného formulára a hlavne na to, že sa úkon vykonáva v metóde actionEditor(), nie v renderEditor(). Vyplýva to z životného cyklu akcie Nette prezentačného.

Ďalej si všimnite použitie Nette knižnice pre vytvorenie editačného formulára, čo nám, mimo napr. Bezpečnosti, v šablóne následne ušetrí veľa kódu pri jeho vykresľovanie ;)

App / CoreModule / presenters / Administration­Presenter.php

Ešte ako dnes skončíme s Presenter, vytvoríme si jeden prázdny pre administračné sekciu. Prázdny bude preto, že v tejto chvíli v podstate nepotrebujeme do jeho šablóny nič odovzdávať:

<?php

namespace App\CoreModule\Presenters;

use App\Presenters\BasePresenter;

/**
 * Presenter pro vykreslování administrační sekce.
 * @package App\CoreModule\Presenters
 */
class AdministrationPresenter extends BasePresenter
{
}

Nabudúce, v lekcii Jednoduchý redakčný systém v Nette - Dokončenie administrácia , si pridáme ešte presenter pre kontaktný formulár a potom tiež všetky chýbajúce šablóny. Tými administráciu článkov v našom redakčnom systéme dokončíme :)


 

Predchádzajúci článok
Jednoduchý redakčný systém v Nette - Výpis článku
Všetky články v sekcii
Základy Nette frameworku
Preskočiť článok
(neodporúčame)
Jednoduchý redakčný systém v Nette - Dokončenie administrácia
Č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