7. díl - 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

Unicorn College ONEbit hosting 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, a 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ýpisy článků.

Konfigurace bundlu

Doposud jsme byli zvyklí, že konfiguraci aplikace jsme dávali do složky app/config/. Na tom obecně není nic špatného, ale když má být náš AppBundle samostatný celek aplikace, bude možná lepší, když bude obsahovat i svou specifickou konfiguraci. Začneme vytvořením složky src/AppBundle/Re­sources/config/, kam posléze umístíme naše konfigurační soubory.

src/AppBundle/Re­sources/config/pa­rameters.yml

Nejdříve si vytvoříme parametrickou konfiguraci našeho bundlu. Zde se umisťují "konstanty", které představují nějaké nastavitelné hodnoty. My si zde zatím uvedeme pouze URL adresu článku pro úvodní stranu našeho redakčního systému:

# Nastavení parametrů konfigurace.
parameters:
    default_article_url: uvod                 # URL výchozího článku.

src/AppBundle/Re­sources/config/ser­vices.yml

Další na řadě bude soubor pro registraci služeb v rámci DI (Dependency Injection). S tím už jsme se setkali ve 4. lekci kurzu při registraci služby modelu kalkulačky, přičemž princip se nemění, pouze si pro to uděláme samostatný soubor. Do něho si pak registrujeme jako službu repositář pro správu článků:

# Nastavení služeb dále přístupných pomocí DI v rámci celé aplikace.
services:
    article_repository:
        class: AppBundle\Repository\ArticleRepository
        factory: ['@doctrine.orm.default_entity_manager', getRepository]
        arguments:
            - AppBundle\Entity\Article

Zde si všimněte, že při registraci Doctrine repositáře jako služby definujeme i entitu, se kterou pracuje, v našem případě třídu Article.

src/AppBundle/De­pendencyInjec­tion/AppExten­sion.php

Konfigurační soubory bychom měli, ale to bohužel nestačí. My musíme naší Symfony aplikaci ještě sdělit, že když načítá náš AppBundle, musí zároveň zpracovat i námi definované konfigurační soubory. To uděláme pomocí zavedení Extension třídy, která v našem případě bude vypadat takto:

<?php

namespace AppBundle\DependencyInjection;

use InvalidArgumentException;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;

/**
 * Rozšíření bundlu pro automatické načítání specifické konfigurace.
 * @package AppBundle\DependencyInjection
 */
class AppExtension extends Extension
{
        /**
         * Načte specifickou konfiguraci.
         *
         * @param array            $configs   pole konfiguračních hodnot
         * @param ContainerBuilder $container instance ContainerBuilder
         *
         * @throws InvalidArgumentException když poskytnutý konfigurační tag není definovaný v tomto rozšíření
         */
        public function load(array $configs, ContainerBuilder $container)
        {
                $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
                $loader->load('parameters.yml');
                $loader->load('services.yml');
        }
}

V podstatě musíme pouze rozšířit Symfony třídu Extension a doplnit metodu load() tak, aby načetla naše konfigurační soubory pomocí příslušného loaderu.

Kontroler

Budeme pokračovat s kontrolerem pro výpis článku.

src/AppBundle/Con­troller/Article­Controller.php

Můžeme klidně použít i základní src/AppBundle/Con­troller/Defau­ltController.php a změnit ho na náš nový ArticleController, který bude předávat data článku do šablony a bude vypadat následovně:

<?php

namespace AppBundle\Controller;

use AppBundle\Entity\Article;
use AppBundle\Repository\ArticleRepository;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Zpracovává vykreslování článků.
 * @package AppBundle\Controller
 */
class ArticleController extends Controller
{
        /**
         * Načte a vykreslí článek článek do šablony podle jeho URL.
         * @param null|string $url URL článku
         * @return Response HTTP odpověď
         * @Route("/", name="homepage")
         * @Route("/{url}", name="article_detail")
         */
        public function indexAction($url = null)
        {
                // Pokud není zadaná URL, nastaví se jí hodnota pro výchozí článek.
                if (!$url) $url = $this->getParameter('default_article_url');

                /** @var ArticleRepository Repositář pro práci s články. */
                $articleRepository = $this->container->get('article_repository');

                // Pokusí se načíst článek s danou URL a pokud nebude nalezen, vyhodí chybu 404.
                if (!($article = $articleRepository->getArticle($url)))
                        throw $this->createNotFoundException('Článek s danou URL neexistuje!');

                // Předá článek do šablony.
                return $this->render('AppBundle:Article:index.html.twig', [
                        'article' => $article
                ]);
        }
}

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

  • Zápis routování se získáním URL daného článku.
  • Způsob získání parametru URL adresy výchozího článku z konfigurace.
  • Vyhození výjimky v Symfony pokud článek s danou URL neexistuje.

Šablony

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

src/Resources/vi­ews/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 Twig šablona base.html.twig, předpřipravená v Symfony Standard Edition, ze kterého vycházíme.

<!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 rel="stylesheet" href="{{ asset('bundles/app/css/style.css') }}" type="text/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('homepage') }}">Ú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>

src/Resources/vi­ews/Article/in­dex.html.twig

Dále dodáme šablonu i pro samotný výpis článku. Opět zde můžeme použít šablonu src/Resources/vi­ews/Default/in­dex.html.twig, jen musíme složku Default/ správně přejmenovat na Article/. Dále již jen upravíme šablonu index.html.twig do následující podoby:

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

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

Instalace zdrojů

Šablony máme hotové, ale je tu ještě jeden drobný problém a to jak se dostat ke zdrojům (např. CSS nebo JavaScript) uvnitř uzavřeného bundlu.

Podle oficiálního postupu bychom pro tyto účely měli použít nejlépe externí bundle Assetic. Avšak my máme zatím ve zdrojích pouze jeden CSS soubor a tak si opět trochu ušetříme práci ruční instalací zdrojů příkazem:

php bin/console assets:install --symlink

Ten pouze nakopíruje zdroje z AppBundlu do veřejné složky web/, případně tam vytvoří jejich symbolický odkaz.

Nyní si již 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ě se podíváme hlouběji do AppBundle a to konkrétně na administraci článků. ;)


 

Stáhnout

Staženo 13x (11.61 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?
5 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 (2)

 

 

Komentáře

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.

Zatím nikdo nevložil komentář - buď první!