Lekce 7 - Jednoduchý redakční systém v Symfony - Výpis článku

PHP Symfony Základy Jednoduchý redakční systém v Symfony - Výpis článku

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

Vítám vás všechny u pokračování online kurzu tutoriálů o tvorbě webových aplikací v PHP frameworku Symfony. V minulé lekci, Jednoduchý redakční systém v Symfony - Model článků, jsme si připravili modelovou vrstvu, konkrétně repositář pro práci s články. Jak jsem slíbil, dnes k němu přidáme i kontroler a šablony, čímž v našem redakčním systému zprovozníme výpis článků.

Konfigurace

Začneme ale tím, že lehce nahlédneme do konfigurace Symfony frameworku a zkusíme si zde přidat vlastní parametr.

config/services­.yaml

Náš parametr bude reprezentovat URL adresu článku pro úvodní stránku našeho redakčního systému. Parametry dále předávané do aplikace se standardně nastavují v souboru services.yaml a tak ho sem přidáme i my:

...
# Put parameters here that don't need to change on each machine where the app is deployed
# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
    locale: 'en'
    default_article_url: 'uvod' # URL výchozího článku.
...

Za nás je to vše, ale můžete se zde také podívat, jak je obecně řešená konfigurace služeb v Symfony, dále předávaných pomocí DI.

Kontroler

Budeme pokračovat již slíbeným kontrolerem pro správu článku.

src/Controller/Ar­ticleController­.php

Ten bude vypadat následovně:

<?php

namespace App\Controller;

use App\Entity\Article;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Kontroler pro vykreslování článků.
 * @package App\Controller
 */
class ArticleController extends AbstractController
{
    /**
     * Načte článek podle jeho URL a předá jej do šablony.
     * Pokud není zadaná URL, nastaví se jí hodnota pro výchozí článek.
     * @param Article $article článek
     * @return Response HTTP odpověď
     * @throws NotFoundHttpException Jestliže článek s danou URL nebyl nalezen.
     * @Route("/{url?%default_article_url%}", name="article")
     * @Entity("article", expr="repository.findOneByUrl(url)")
     */
    public function index(Article $article): Response
    {
        return $this->render('article/index.html.twig', ['article' => $article]);
    }
}

Kostru pro kontroler si opět můžete nechat automaticky vytvořit pomocí Symfony příkazu php bin/console make:controller ArticleController ;)

Zde asi upozorním hned na několik věcí:

  • Zápis routování získávající URL daného článku a také způsob získání výchozího článku z konfigurace, pokud není URL adresa zadána uživatelem (anotace @Route)
  • Mapování této URL na entitu článku pomocí repositáře, přičemž ta je následně předána jako parametr metody (anotace @Entity)
  • Automatické vyvolání výjimky (Symfony třída NotFoundHttpException) pokud článek s danou URL neexistuje

Šablony

Nyní je tedy čas podívat se na zoubek šablonám.

templates/base­.html.twig

Samozřejmě nezačneme ničím jiným než úpravou celkového vzhledu naší aplikace, který v tomto případě zajišťuje výchozí Twig šablona base.html.twig:

<!DOCTYPE html>
<html lang="cs-cz">
    <head>
        <meta charset="UTF-8"/>
        <title>{% filter striptags %}{% block title %}{% endblock %}{% endfilter %}</title>
        <meta name="description" content="{% filter striptags %}{% block description %}{% endblock %}{% endfilter %}"/>

        {% block stylesheets %}
            <link type="text/css" rel="stylesheet" href="{{ asset('css/style.css') }}">
        {% endblock %}
    </head>
    <body>
        <header>
            <h1>Jednoduchý redakční systém v Symfony</h1>
        </header>

        {# Výpis zpráv. #}
        {% for type, flash_messages in app.session.flashBag.all %}
            {% for flash_message in flash_messages %}
                <div class="message">{{ flash_message }}</div>
            {% endfor %}
        {% endfor %}

        <nav>
            <ul>
                <li><a href="{{ path('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>{{ block('title') }}</h1>
            </header>
            <section>
                {% block body %}{% endblock %} {# Vložení obsahu do šablony. #}
            </section>
        </article>

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

        {% block javascripts %}{% endblock %}
    </body>
</html>

templates/arti­cle/index.html­.twig

Dále dodáme šablonu i pro samotný výpis článku, která bude mít následující podobu:

{% extends 'base.html.twig' %}

{% block title %}{{ article.title }}{% endblock %}
{% block description %}{{ article.description }}{% endblock %}
{% block body %}{{ article.content|raw }}{% endblock %}

Pokud jste si nechali automaticky vygenerovat kontroler, máte připravenou již i kostru této šablony.

Nyní si můžete zkusit web spustit a podívat se na úvodní stránku. Je to jistě příjemný pocit po tom, co jsme změnili tolik kódu, že? :)

Úvodní stránka redakčního systému v Symfony frameworku

Úplný základ máme zprovozněný. Příště v lekci Jednoduchý redakční systém v Symfony - Administrace půjdeme o zase něco hlouběji podíváme se na administraci článků ;)


 

Stáhnout

Staženo 46x (13.35 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?
4 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 (5)

 

 

Komentáře

Avatar
lukincok
Člen
Avatar
lukincok:28. března 16:52

Ďakujem autorovi za tento tutoriál. :-)

Mám jeden postreh: v minulej časti sme si vkladali do databázy dva články. Jeden z nich mal podľa obsahu slúžiť pre chybovú stránku 404. V tejto časti sme ale kontroleru povedali, aby vyhodil výnimku tiež pre chybu 404 s nejakým našim popisom. Problém je, že nikde v nasledujúcich častiach už chybu 404 neriešime (alebo mám problémy so zrakom), takže na produkčnej verzii sa v prípade neplatnej adresy zobrazuje len štadnardná Not Found šablóna frameworku. Článok pre túto chybu sa teda zobrazí len v prípade, že si ho zavolám v URL a chybová hláška definovaná v kontroleri je viditeľná iba na dev verzii.

Možno by teda bolo dobré doplniť nejaké inštrukcie, ako vytvoriť šablónu pre chybovú stránku s výpisom hlášky, prípadne ako prepojiť článok "chyba" s chybou 404 bez toho, aby sa presmerovalo na ten článok. Vďaka. ;-)

 
Odpovědět  +2 28. března 16:52
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 1 zpráv z 1.