5. díl - Jednoduchý redakční systém v Nette - Struktura projektu

PHP Nette Framework Základy Jednoduchý redakční systém v Nette - Struktura projektu

Vítám všechny středně pokročilé a pokročilé programátory u pokračování seriálu tutoriálů o tvorbě webových aplikací v PHP frameworku Nette. V minulém díle, který byl věnován spíše začátečníkům, jsme dokončili první jednoduchou aplikaci a dnes bych se tak chtěl posunout někam dál. Začneme nový projekt, kterým bude jednoduchý redakční systém s editorem článků. To je již zajímavější webová aplikace, na které si můžeme vyzkoušet další věci, co nám Nette nabízí (hlavně práci s databází). Konkrétně dnešní díl bude tedy věnován především struktuře našeho projektu a jeho základnímu nastavení.

Struktura projektu

Reálné komerční projekty mají spoustu tříd a určitě bychom si v nich nevystačili pouze s rozdělením struktury projektu na modely, presentery a šablony. Mít v jedné složce desítky souborů je minimálně nepřehledné. Kód by se špatně spravoval a z vlastní zkušenosti mohu říci, že byste se dostali do bodu, kdy byste psali podobné metody znovu a znovu místo toho, abyste parametrizovali nějakou existující, protože byste zkrátka ani nevěděli, že v projektu nějaká podobná již je. A to je začátek konce :) Jak z toho ven?

Jmenné prostory a moduly

Třídy rozdělíme do logických skupin a určitě vás nepřekvapí, že za tímto účelem využijeme jmenných prostorů. To je přesně ten nástroj určený k řešení právě problému s vysokým počtem tříd. Protože budeme počítat s tím, že náš projekt poroste, což je vždy dobré, nespokojíme se ani s jednoduchým rozdělením složek MVP do několika podsložek. Celou aplikaci rozdělíme ještě do tzv. Nette modulů.

Modulů je ve webové aplikaci obvykle poměrně nízký počet (např. kolem 3) a můžeme je chápat jako samostatné části, ze kterých se aplikace skládá. Pokud si napíšeme jednou modul např. na Eshop, můžeme ho později dodat do ostatních projektů, které jsou na našem systému postavené a to aniž bychom něco složitě upravovali. V každém projektu budou zároveň jen ty moduly, které jsou zapotřebí, aby nebyl příliš složitý nebo abychom zákazníkovi prostě nedávali veškeré naše know-how. :) V tomto projektu si vytvoříme pouze jeden modul, který nazveme CoreModule (v Nette je oblíbený název také FrontModule):

  • CoreModule - Hlavní jádro, které dokáže spravovat články a uživatele. Jedná se v podstatě o základní CMS (Content Management System, správa obsahu).

Mimochodem, všimněte si, že jsem moduly pojmenoval anglicky. Celý náš web budeme programovat v angličtině, čeština je v programování pouze pro začátečníky a v reálných aplikacích by se objevovat neměla. Důvodem je zejména fakt, že se angličtině v kódu nevyhneme (už jen samotné PHP je anglicky a budeme používat i další třídy třetích stran) a míchat 2 jazyky do sebe je nepřehledné.

Struktura webu

Pro náš projekt budeme potřebovat klasicky webový server (např. Apache) s PHP ve verzi 5.3.1 nebo vyšší a MySQL databázi (můžete použít i jinou SQL databázi, ale za funkčnost SQL skriptů pak neručím) a postavíme ho klasicky na Nette sandboxu ve verzi 2.3.3. Pokud nevíte, jak rozchodit webový server s databází, doporučuji článek Instalace Apache, MySQL a PHP na Windows a pokud nevíte, jak získat a zprovoznit sandbox, vřele doporučuji přečíst si Nette sandbox a IDE. Nyní tedy předpokládám, že máme před sebou čerstvý sandbox a my v něm provedeme několik následujících změn.

Úprava sandboxu

  • Za předpokladu, že jste to již neudělali, tak přímo do kořenové složky našeho projektu (sandboxu) si přidáme .htaccess, který zajistí automatické přesměrování všech požadavků do složky www/. Tento soubor samozřejmě najdete v přiloženém archívu a může vypadat třeba takto:
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule ^$ www/ [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !^www/
        RewriteRule ^(.*)$ www/$1
</IfModule>
  • Poté můžeme odstranit pro nás nepotřebné složky jako bin/, tests/ a temp/sessions/.
  • Pro ty z vás, kteří používají Composer, můžeme odlehčit vendor/ od některých závislostí a to konkrétně od celého require-dev, protože nette/tester potřebovat nebudeme a potom od dg/adminer-custom, protože Adminer také potřebovat nebudeme. Pak nezapomeňte spustit:
composer update

Konfigurace složky app/

Dále, už zase my všichni, se přesuneme do složky app/ a pokračujeme v nastavování a mazání nepotřebného:

  • Prvním důležitým krokem je přesun složky app/presenters/templates o úroveň výše, do složky app/, kvůli vyhledávání výchozího @layout.latte z vnořených modulů.
  • Poté zde smažeme složku forms/, kde je předpřipravený formulář pro přihlašování, který ale nebudeme potřebovat a naopak zde vytvoříme obecnější adresář components/ pro naše budoucí komponenty. Bohužel po smazání složky forms/ musíme smazat ještě ještě presenters/SignPresenter.php a složku templates/Sign/, kvůli nenaplněným závislostem a v souboru config/config.neon umazat řádku - App\Forms\SignFormFactory.
  • Dále zde vytvoříme složku pro náš modul CoreModule a v ní podsložky a soubory klasické Nette adresářové struktury např.: CoreModule/model/, CoreModule/config/config.neon, CoreModule/components/ a CoreModule/templates/. A do vytvořeného souboru config.neon doplníme následující:
# Konfigurační soubor pro CoreModule.

parameters:

# Nastavení služeb dále přístupných pomocí DI v rámci celé aplikace.
services:
  • Dále pak na konec globálního konfiguračního souboru app/config/config.neon vložíme konfigurační soubory z obou modulů takto:
# Vložení konfiguračních souborů z jednotlivých modulů.
includes:
    - ../CoreModule/config/config.neon

Konfigurace složky www/

Nakonec se ještě přesuneme do složky www/, kde uděláme pár posledních úprav:

  • Smažeme zde složku adminer/, kterou nebudeme potřebovat.
  • Vymažeme obsah složky images/, opět je zbytečný.
  • Můžeme si zde také rovnou vytvořit složky, které využijeme později a to files/ a fonts/.
  • A v neposlední řadě zavedeme vlastní CSS a to tak že upravíme soubor css/style.css takto:
body {
    font-family: verdana, serif;
    font-size: 14px;
    width: 900px;
    margin: 0 auto;
}

h1 {
    text-align: center;
    color: #444444;
    text-shadow: 3px 3px 3px #aaaaaa;
}

footer {
    font-size: 11px;
    text-align: center;
    padding-top: 20px;
}

article {
    text-shadow: 3px 3px 3px #aaaaaa;
}

nav ul {
    list-style-type: none;
}

nav li {
    float: left;
    margin-right: 15px;
}

nav a {
    background: #6FA4F8;
    color: white;
    padding: 5px 10px;
    border-radius: 10px;
    text-decoration: none;
    border: none;
}

nav a:hover {
    background: #2976f8;
    color: #EEEEEE;
    text-decoration: none;
}

input[type="submit"] {
    background: #6FA4F8;
    color: white;
    padding: 5px 10px;
    border-radius: 10px;
    border: 0;
}

input[type="submit"]:hover {
    background: #2976f8;
    color: #EEEEEE;
    cursor: pointer;
}

input[type="text"], input[type="email"], input[type="password"] {
    width: 250px;
    border-radius: 5px;
    border: 1px solid #aaaaaa;
    padding: 0.3em;
}

input[type="submit"] {
    padding: 10px 25px;
    display: block;
    margin: 20px auto 0;
    font-weight: bold;
}

textarea {
    border-radius: 5px;
    border: 1px solid #aaaaaa;
    width: 483px;
    height: 90px;
}

.message {
    border: 1px solid #9DC2F8;
    background: #DBE8F8;
    padding: 3px;
}

Pokud jsme vše udělali správně, měli bychom být stále schopni spustit web, vidět výchozí stránku sandboxu a naše adresářová struktura by měla vypadat asi takto:

Adresářová struktura projektu v Nette

Tímto dnešní díl končí, všechno jsme si hezky připravili a příště se tedy rovnou vrhneme na programování. Vytvoříme si databázi a začneme pracovat na CoreModule ;)


 

Stáhnout

Staženo 262x (664.28 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

  Aktivity (1)

Článek pro vás napsal Jindřich Máca
Avatar
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. :-)

Jak se ti líbí článek?
Celkem (8 hlasů) :
4.6254.6254.6254.6254.625


 


Miniatura
Předchozí článek
Dokončení kalkulačky v Nette
Miniatura
Všechny články v sekci
Základy Nette frameworku

 

 

Komentáře
Zobrazit starší komentáře (15)

Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Jindřich Máca:

!!!UPOZORNĚNÍ!!!

Dnes, při psaní dalšího dílu seriálu, jsem ještě narazil na jeden problém s Nette, který se dá ale snadno a elegantně vyřešit změnou struktury projektu ani ne za 5s. Avšak to znamená, že jsem musel upravit i tento článek. Konkrétně se jedná se o přesun složek templates/ v adresářové struktuře.

Ty, kdož mají už zdrojové kódy stažené, potažmo napsané, podle staré verze článku a chtějí v nich pokračovat, tímto upozorňuji, aby u sebe tuto změnu také provedli, jinak pravděpodobně narazí na stejný problém jako já. :)

Omlouvám se všem za komplikace a zároveň děkuji za pochopení!

Editováno 6.7.2015 22:12
 
Odpovědět 6.7.2015 22:10
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:

Nefunguje mi import toho druhého config souboru.

Nette\Utils\NeonException

Either tabs or spaces may be used as indenting chars, but not both. on line 30, column 5. search►

NEON

File: ...\app\config\config.neon:30

20:            expiration: 14 days
21:
22:
23:    services:
24:        - Model\UserManager
25:        - App\RouterFactory
26:        router: @App\RouterFactory::createRouter
27:
28:    # Vložení konfiguračních souborů z jednotlivých modulů.
29:    includes:
30:        - ../CoreModule/config/config.neon
31:

stáhl jsem si zdrojové kódy a je to tam napsané stejně, jak to mám já, nevíš kde je chyba?

 
Odpovědět 30.9.2015 17:02
Avatar
Odpovídá na Milan Gallas
Martin Konečný (pavelco1998):

V NEON souboru můžeš použít buď tabulátory nebo mezery, ne oboje (přesně jak píše výjimka).

 
Odpovědět  +2 30.9.2015 17:08
Avatar
Michael Kufner:

File 'C:\xampp\htdoc­s\cms\app/con­fig/../CoreMo­dule/config/con­fig.neon' is missing or is not readable.

Mám stejný problém jako Milan Gallas.
Prostě to nebere tu "../" jako nadřazenou složku. Kde je chyba? :/

 
Odpovědět 21. června 22:40
Avatar
Zkusto s.r.o.:

Když přesunu složku "templates" o úroveň výše, tak přestane fungovat error presenter, respektive nenačte šablonu. Když složku vrátím, tak 404 chyba funguje jinak je chyba 500.

Možná jsem něco přehlédl, ale nepřišel jsem na to, čím to může být.

 
Odpovědět 3. října 21:44
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Zkusto s.r.o.
Jindřich Máca:

Tak ji klidně nech tam, kde je... :-D

 
Odpovědět 3. října 23:14
Avatar
danhosek
Člen
Avatar
danhosek:

Ahoj, ještě si chci opravit ještě jednu chybu. Jde o načtení css souborů do latte, sčímž je něaký problém.
Css soubory mám ve složce www/css a link na ně v layout.latte:
<link rel="stylesheet" type="text/css" href="{$basePat­h}/css/animate­.css">
<link rel="stylesheet" type="text/css" href="{$basePat­h}/css/style.css">
úplně totéž mám v app\CoreModule\tem­plates\Article uvod.latte (šablona pro úvodní článek).
V uvod se css načtou, ale v layoutu se ne něak moc nevím {$baseath} se definuje v .htaccess? takže nastaví base na www? a pro všechny soubory, které směřují do www/ dám na začátek {$basePath}?(myslim .js soubory a img).
Děkuji.

 
Odpovědět 16. října 21:28
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na danhosek
Jindřich Máca:

No nazdar... Můžeš mi říct, jak se Ti takhle daří plést páté přes deváté? :D

Takže hezky popořadě si to ujasníme.

  1. Proměnou {$basePath} dosazuje Latte do šablon automaticky a standardně odpovídá právě složce www/. V souboru .htaccess se dá také definovat, ale tyto dvě spolu mají pramálo společného.
  2. Šablona @layout.latte se používá úplně vždycky, pokud si to nevynutíš jinak, a teprve do ní se vkládá obsah šablon jednotlivých akcí presenterů. Navzdory tomu, sama o sobě se nikdy neaplikuje, protože samostatně neodpovídá žádné akci presenteru.
  3. V šabloně layout máš tedy následující styly:
<link rel="stylesheet" type="text/css" href="{$basePath}/css/animate.css">
<link rel="stylesheet" type="text/css" href="{$basePath}/css/style.css">

Za předpokladu, že jsou styly správně umístěny ve složce www/ to znamená, že ony styly se Ti díky výše uvedeným vlastnostem @layout.latte aplikují v rámci každé stránky, kterou v projektu máš, pokud sis to nenastavil jinak.

Takže tohle jsou věci, které jsem z Tvého příspěvku pochopil. Můžeš mi pak ale vysvětlit, co znamenají výroky

úplně totéž mám v app\CoreModule\tem­plates\Article uvod.latte

nebo

V uvod se css načtou, ale v layoutu se ne něak moc nevím {$baseath} se definuje v .htaccess?

Nejen, že tam jsou překlepy, ale minimálně ta druhá věta nedává vůbec smysl...

Takže doufám, že Ti můj příspěvek objasnil alespoň část z Tvých dotazů, na zbytek se hold budeš muset zeptat znovu a lépe. :)

Editováno 17. října 15:13
 
Odpovědět 17. října 15:12
Avatar
danhosek
Člen
Avatar
danhosek:

Jsem to napsal nepochopitelně, za to se omlouvám.
Mám pro úvodní článek zvláštní šablonu, v ArticleManager mám nastaveno:

if (!$url or $url == self::DEFAULT_ARTICLE_URL){
            $url = self::DEFAULT_ARTICLE_URL;
            $this->template->setFile(__DIR__ . "/../templates/Article/uvod.latte");

aby úvodní článek vypadal jinak.
zbytek vemu se vkládá do layoutu jak má, čímž je layout základ zbylého webu mimo úvod.
Na úvodní stránce se šablona zobrazuje správně a css styly se načtou, ale když najedu na zbytek webu (např.: výpis článků), který se zobrazuje přes layout, tak se css nenačtou. U obou latte šablon je to udělané úplně stejně a přesto to u jednoho se cdd načtou a u druhého ne.
I když u obou šablon ve zdrojovém kˇodu jsou css odkazovány na neeistující složku
href="css/ani­mate.css"
U {$basePath} mě zajímalo právě to, zda to nastaví cestu do složky /www/ a jestli to určí tuto složku pomocí .htaccess, na což jsi mi odpověděl :).

 
Odpovědět 17. října 18:42
Avatar
danhosek
Člen
Avatar
Odpovídá na danhosek
danhosek:

Už jsem přišel, v čem byl problém. Měl jsem to udělané správně, ale zobrazoval se starý obsah, tak jsem smazal obsah \temp\cache\latte , čímž se pohledy udělali nové a funkční. :-)

 
Odpovědět 18. října 1:32
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 10 zpráv z 25. Zobrazit vše