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ľ |
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 rozhraniaNette\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