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

2. diel - Cms v Nette a Doctrine 2 - Kostra aplikácie

V minulej lekcii, Úvod do Doctrine 2 v Nette frameworku , sme si predstavili potrebné technológie. V dnešnom Nette tutoriálu si pomocou Composer stiahneme všetky dôležité knižnice a vytvoríme základnú kostru našej aplikácie.

Založenie projektu

Získanie potrebných knižníc

K získaniu knižníc použijeme Composer. Všetky dôležité informácie nájdete na oficiálnom webe https://getcomposer.org.

Composer využíva súboru composer.json, v ktorom je uvedené aké všetky knižnice majú v aplikácii byť. Môžeme potom pomocou príkazového riadka všetky knižnice stiahnuť.

Potom, čo Composer nainštalujete, v príkazovom riadku zadajte cestu k priečinku, kde chcete mať náš projekt, napr .:

cd xampp/htdocs/nette_doctrine

a napíšte:

composer create-project nette/sandbox nazev_projektu

Composer.json

Predchádzajúcim príkazom sa nám stiahne sandbox Nette s adresárovou štruktúrou. Automaticky sa tiež vytvoril súbor composer.json. Ten otvorte a do parametra require pridajte:

...
"doctrine/orm": "*",
"kdyby/annotations": "^2.2",
"kdyby/console": "^2.4",
"kdyby/events": "^2.4",
"kdyby/doctrine-cache": "^2.4",
"kdyby/doctrine": "~2.3.1",
"symfony/config": "~2.7",
"symfony/translation": "~2.7",
"kdyby/translation": "~2.2"
...

Týmto určíme, aby sa nám stiahli všetky potrebné knižnice pre náš projekt. Nakoniec v príkazovom riadku zadajte cestu k priečinku, kde je súbor composer.json, a napíšte:

composer update

Týmto Composer prejde súbor, zistí, ktoré knižnice sú nové alebo upravené, a aktualizuje. Všetky knižnice sťahuje do zložky vendor/.

Ak budeme chcieť v priebehu sťahovať ďalší knižnice, nemusíme ručne upravovať súbor, stačí v príkazovom riadku napísať príkaz

composer require nazev/knihovny

napr .:

composer require kdyby/translation

Keďže sme stiahli sandbox nette, máme adresárovú štruktúru vytvorenú automaticky.

Poznámka: Skúšal som to len na Windows, na Linuxe bude zrejme trochu iný postup. Všetko je ale na oficiálnych stránkach Composer vysvetlené.

Konfigurácia

App / config / config.local.neon

V našom lokálnom konfiguračnom súbore config.local.neon zmeníme informácie o našej databáze pre Doctrine:

parameters:


doctrine:
    user: root
    password: ****
    dbname: doctrine
    metadata:
        App: %appDir%

Prihlasovacie meno a heslo si samozrejme nastavte podľa seba.

Metadáta (informácie o entitách atp.) Bude Doctrine hľadať v našej zložke app/.

App / config / config.neon

Do hlavného konfiguračného súboru config.neon potom zaregistrujeme všetky naše rozšírenia:

...
extensions:
    console: Kdyby\Console\DI\ConsoleExtension
    events: Kdyby\Events\DI\EventsExtension
    annotations: Kdyby\Annotations\DI\AnnotationsExtension
    doctrine: Kdyby\Doctrine\DI\OrmExtension
    translation: Kdyby\Translation\DI\TranslationExtension

A na záver si pripravíme možnosť prekladov a povolíme slovenčinu a angličtinu (defaultne bude použitá Čeština).

...
translation:
    default: cs
    fallback: [cs, en]
    whitelist: [cs, en]

Úprava routeru

App / router / RouterFactory.php

Aby sme mohli rozpoznať, v akom jazyku chce používateľ stránky zobraziť, pridáme do masky routeru nepovinný parameter locale.

<?php

namespace App;

use Nette;
use Nette\Application\IRouter;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;

/**
 * Routovací továrnička.
 * Řídí routování v celé aplikaci.
 * @package App
 */
class RouterFactory
{

    /**
     * Vytváří router pro aplikaci.
     * @return IRouter výsledný router pro aplikaci
     */
    public static function createRouter()
    {
        $router = new RouteList();
        $router[] = new Route("[<locale=cs cs|en>/]<presenter>/<action>[/<id>]", "Homepage:default");
        return $router;
    }
}

Pomocou hranatých zátvoriek sme určili, že parameter locale nie je povinný a pokiaľ nebude v URL vyplnený, použije sa defaultne Čeština.

Naše URL potom môžu vyzerať napr. en/article-category/list.

Spôsob prekladu

Všetky texty, ktoré sa budú prekladať, budú uložené pod kľúčom v NEON súboru (rovnaký používa i konfiguračný súbor). Ako to funguje, si môžete skúsiť tu: http://ne-on.org.

Preklady budeme písať do jednotlivých súborov podľa toho, kam dané texty spadajú (texty ohľadom článkov budú v súboroch article, pre formuláre v súboroch form, pre výnimky exception, všeobecné texty common pod.). Kdyby\Translation sa potom automaticky postará o načítanie všetkých dôležitých súborov. Spôsob rozdelenie je teda na nás, ako sa nám to zdá prehľadné (priznávam, že nakoniec aj tak budú texty rôzne pohádzané).

Výhodou tohto nástroja tiež je, že môžeme prekladať aj texty s premenlivým obsahom - jednoducho napíšeme zástupný identifikátor, ktorý sa potom prepíše hodnotou, napr .:

textKey: "Celkem je zde %articlesCount% článků a %usersCount% aktivních uživatelů"

V šablóne potom hodnoty dosadíme pomocou poľa.

{_textKey, ["articlesCount" => 500, "usersCount" => 30]}

// vypíše  Celkem je zde 500 článků a 30 aktivních uživatelů

Preklad už na úrovni vrstvy Presenter obstaráva trieda Kdyby\Translation\Translator. Tú si automaticky injectujeme do triedy BasePresenter a tiež sa bude odovzdávať konštruktor do form factory tried.

App / presenters / BasePresenter.php

Konečne sa dostávame k troche akcie. Ako prvý si upravíme náš BasePresenter a vytvoríme mu atribút locale a Translator, ktorý sa automaticky injectuje. Nezabúdajte, že všetky atribúty, ktoré sa injectují automaticky, musí mať viditeľnosť public.

<?php

namespace App\Presenters;

use App\Model;
use Nette;
use Nette\Application\UI\Presenter;

/**
 * Základní presenter pro všechny ostatní presentery aplikace.
 * @package App\Presenters
 */
abstract class BasePresenter extends Presenter
{
    /** @persistent null|string Určuje jazykovou verzi webu. */
    public $locale;

    /**
     * @var \Kdyby\Translation\Translator Obstarává jazykový překlad na úrovni presenteru.
     * @inject
     */
    public $translator;
}

Atribút $ locale obsahuje informáciu o jazyku. Vďaka anotáciu @persistent je hodnota automaticky odovzdávaná pri každej požiadavke - nemusíme ju preto uvádzať v odkazoch.

Makro na preklad

Ďalej si ešte do triedy BasePresenter zaregistrujeme makro na preklad:

...
/**
 * Registrace makra na překlad.
 * @inheritdoc
 */
protected function createTemplate()
{
    /** @var Template $template Latte šablona pro aktuální presenter. */
    $template = parent::createTemplate();
    $this->translator->createTemplateHelpers()
        ->register($template->getLatte());
    return $template;
}

Týmto zaregistrujeme makro {_}, vďaka ktorému je možné v šablóne jednoducho preložiť text, a nemusíme tak preklady ukladať do premenných a odovzdávať šablónam.

Databázová štruktúra

Aby sme nemuseli v každom ďalšom článku niečo pridávať alebo upravovať, priložím rovno súbor db.sql s SQL príkazom, ktorý celú databázu vytvorí.

Databáza obsahuje päť tabuliek:

  • article
  • article_category
  • article_comment
  • user
  • user_settings

Do databázy budú automaticky pridanie dvaja užívatelia:

Meno heslo popis
admin admin administrátor
user user užívateľ
Poznámka: Doctrine vie z entít vygenerovať štruktúru databázy a opačne. Viac sa dozviete tu.

Prebytočné súbory v Nette sandboxe

  • model/UserManager.php - tento súbor z projektu úplne odstráňte - nielen, že nám k ničomu nebude, ale naopak by nám prekážal (kvôli implementácii rozhrania Nette\Security\IAuthenticator). Tiež ho odstráňte zo súboru config.neon.
  • forms/SignFormFactory.php - môžete odstrániť, my si budeme vytvárať náš vlastný, trochu odlišný.
  • presenters/SignPresenter.php - tiež si budeme vytvárať vlastné.

Týmto druhú lekciu zakončíme. V lekcii budúci, Cms v Nette a Doctrine 2 - Modely a Layout , začneme pomaly stavať našu modelovú vrstvu.


 

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é 287x (3.43 MB)
Aplikácia je vrátane zdrojových kódov v jazyku PHP

 

Predchádzajúci článok
Úvod do Doctrine 2 v Nette frameworku
Všetky články v sekcii
Cms v Nette a Doctrine 2
Preskočiť článok
(neodporúčame)
Cms v Nette a Doctrine 2 - Modely a Layout
Článok pre vás napísal Martin Konečný (pavelco1998)
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se o IT moc nezajímá, raději by se věnoval speciálním jednotkám jako jsou SEALs nebo SAS. Když už to ale musí být něco z IT, tak tvorba web. aplikací v PHP. Také vyvýjí novou českou prohlížečovou RPG hru a provozuje osobní web http://www.mkonecny.cz
Aktivity