Souhrnný návod pro začátečníky – principy a routování
- net-vor
- Člen | 35
Zdravím všechny, jsem v Nette naprostý začátečník. Prostudoval a vyzkoušel jsem modelové příklady a pročetl tutoriály i fórum, ale nakonec musím přiznat, že mi stále něco zásadního uniká. Zkusím se proto obrátit na zkušenější dobrotivce. Začnu od konce, tedy od výrobku, který bych chtěl dostat, a vyjdu z modelové situace, kterou jsem za svoji praxi webaře zažil asi dvěstěkrát:
- cílem je klasický jednoduchý „statický web“ s více jazykovými mutacemi
- pro výchozí mutaci jsou URL bez jazykového určení (web.cz/nabidka, web.cz/kontakt ad.), pro další mutace potom s jazykovým parametrem (web.cz/en/offer, web.cz/en/contact)
- obsahová část (content), tedy každá „stránka“ (včetně homepage), se tahá z databáze, html zdroják těchto částí tedy není uložen v pohledech, ale v DB
- pro každou mutaci je – logicky – jiné menu
- hlavní layout (hlavička, patička) je jednotný pro celý web
Pomocí klasického pojetí nebo nějakého svého předpřipraveného „rozhraní“ je tohle všecko triviální a hotové snadno a rychle. Teď přijdou moje zřejmě hloupé dotazy:
- mohl by prosím někdo načrtnout, jak by v Nette vypadal model, presenter a view pro takovouto jednoduchou aplikaci? Moje motivace není lenost nebo házení práce na druhé, ale pomohlo by (nejen mně) to ukázat komplexně na nějakém vysloveně triviálním příkladě. Tutoriály mi tenhle princip moc neobjasnily, byť třeba ten „ToDo list“ je principielně dost podobný.
- je nutné pro každou „stránku“ (míněna pouze ta content část), kterou chci vykreslit, zakládat samostatný presenter?
- jak by pro tento konkrétní příklad vypadalo nastavení routy?
Chtěl bych z toho nejen pochopit základní principy, ale také sepsat nějaký step-by-step tutoriál pro ostatní natvrdlíky – jak jsem tak pročítal návody, mám pocit, že i když se David fakt moc snaží, moc se nepočítá s tím, že někdo potřebuje začít od úplných základů a neuvědomuje si věci, které jsou pro ostatní samozřejmé.
Děkuju za každou radu, vše předám dál, a omlouvám se za dlouhý grafomanský dotaz.
Michal – NET-VOR
- Jan Tvrdík
- Nette guru | 2595
Možností je více, ale po prvotním přečtení zadání bych to napsal takto:
Presentery
PagePresenter
pohledakceview
s parametry$lang
(persistentní, např.'en'
) a$slug
(např.'contact'
)- v metodě
actionView
natáhnout pomocí modelu stránku na základě$slug
a$lang
a uložit do$this->page
. Pokud neexistuje, vyhoditBadRequestException
. V metoděrenderView
předat$this->page
do šablony + předat informace o menu (asi komponenta)
Model
PageManager
s jednou metodufind($slug, $lang)
, která vracíFALSE
neboDibiRow
.
Router
Asi takto (snad je to dobře).
$router = new Route('[<lang>/]<slug>', array(
'presenter' => 'Page',
'action' => 'view',
'lang' => 'cs',
'slug' => 'homepage',
))
- snakeeater
- Člen | 18
net-vor napsal(a):
Chtěl bych z toho nejen pochopit základní principy, ale také sepsat nějaký step-by-step tutoriál pro ostatní natvrdlíky – jak jsem tak pročítal návody, mám pocit, že i když se David fakt moc snaží, moc se nepočítá s tím, že někdo potřebuje začít od úplných základů a neuvědomuje si věci, které jsou pro ostatní samozřejmé.
QFT… Ja jen ze souhlasim s tou casti, ze snaha je opravdu videt. Avsak Nette je muj prvni framework a moje prvotni stretnuti s MVC architekturou, a proto povazuji dokumentaci pro zacatecniky jako ja za vskutku nedostacujici. Omlouvam se za OT
- net-vor
- Člen | 35
ad Jan Tvrdík Díky… Dva dotazy:
- Možná jsem to nepochopil, ale ‚pohled view s parametry‘ – neměly by spíš být ty parametry součástí presenteru, potažmo modelu, a do view se pak jen naleje jediná proměnná s html kódem?
- Při nalívání zdrojáku do view se vše převádí na htmlentities – jde to nějak vypnout?
ad snakeeater No nemůžu než souhlasit a musím říci, že mě dost sejří, že ty nejdůležitější věci se tady člověk vždycky doví jakoby mimochodem… Mně osobně by třeba strašně pomohlo, kdyby se vzal nějaký vysloveně primitivní statický web o třech stránkách a fakt step-by-step by se ukázalo, jak je třeba postavit presenter a view, případně kdyby se do toho zakomponoval model – nějaký vysloveně primitivní úkon typu tahat title databáze nebo něco podobného. Bylo by to více než super a hlavně by to bylo jako celek a v kontextu. Nějaké návody jsou – třeba tady nebo tady, ale buď se to orientuje na jednu složku frameworku a ostatní nezájem, nebo David frčí tak, že to není možné usledovat v kontextu – přeci jen už mi není dvacet…
Podle mě je tenhle můj příklad typický model klasických „firemních“ webů (občas je tam nějaký kontaktní formulář apod.), ale pokud nepočítám nějaké eshopy nebo aplikace vysloveně na míru, tak tohle je nejpoužívanější s tím, že jazykové mutace jsou fakultativní, ale je dobré s tím počítat. Pokud se mi to podaří rozchodit, napsal bych nějaký tutoriál pro ostatní. Já používám svůj „skelet“, kde jsem schopen rychle vytvořit i cokoli složitějšího, Nette je můj první „profi“ framework a chtěl bych na tom stavět vývoj svých dalších webových stránek. Ale fakt bych potřeboval, aby se nepočítalo s tím, že se napíše „máme view contact.en.html a kontakt.cs.html“, v presenteru se to nějak nastaví a pak to stačí naroutovat.
BTW – nevíš o nějakém tutoriálu nebo části z téhle olbřímí dokumentace, která ti fakt pomohla a posunula tě dopředu?
- Lei
- Člen | 4
Já s Nette taky začínám, je to moje první zkušenost s nějakým frameworkem vůbec, o MVC architektuře nemluvě. A znalosti objektového programování mám taky spíš teoretické. Ale docela jsem si vystačil s tutoriály, studováním fóra a když jsem začal programovat a Laděnka hlásila chyby, tak s vyhledáváním ;) (Protože na většinu problému jsem tak našel odpověď)
Můj první „statický“ web po pár týdnech zkoumání Nette už běží ( http://uchlubnu.cz ) a to i se zabezpečeným admin modulem (i když s tím zabezpečením si pořád nejsem nějak jistý, pořád nějak nevěřím, že na to stačí pár řádků kódu ;))
Nemám tam sice různé jazyky, ale preseneter používám jen jeden a o jednotlivé stránky se starají jednotlivé view. Některé věci tam jsou teda poněkud splácané, protože jsem to už potřeboval dodělat a neměl jsem čas dohledávat „správný“ přístup, ale jinak mi k pochopení těch základů stačily vážně jen tutoriály + fórum.
- net-vor
- Člen | 35
Lei – já mám právě „splácaný“ svůj „pravý domácí“ framework – kde vše sice funguje a je to zabezpečené a modulární, ale právě proto jsem sáhl k Nette, protože bych se chtěl posunout a nebastlit. Udělat to pomocí presneteru a views bych už možná zvládl, ale já bych právě chtěl, aby jednotlivé stránky nebyly ve views, ale v databázi (kvůli editačnímu systému – v současné době to mám v souborech a je to pruda), a pak je tu komplikace s těmi jazykovými mutacemi – každý druhý web, který dělám, je vícejazyčný… Na takovouhle variantu jsem nikde žádný tutoriál nenašel, nebo jsem slepec… Takže zatím věštba & pokus/omyl…
Editoval net-vor (20. 10. 2010 12:51)
- Jan Tvrdík
- Nette guru | 2595
net-vor napsal(a):
- Možná jsem to nepochopil, ale ‚pohled view s parametry‘ – neměly by spíš být ty parametry součástí presenteru, potažmo modelu, a do view se pak jen naleje jediná proměnná s html kódem?
„pohled view
s parametry“ → „akce view
s parametry“
- Při nalívání zdrojáku do view se vše převádí na htmlentities – jde to nějak vypnout?
- Mesiah
- Člen | 240
net-vor napsal(a):
Lei – já mám právě „splácaný“ svůj „pravý domácí“ framework – kde vše sice funguje a je to zabezpečené a modulární, ale právě proto jsem sáhl k Nette, protože bych se chtěl posunout a nebastlit. Udělat to pomocí presneteru a views bych už možná zvládl, ale já bych právě chtěl, aby jednotlivé stránky nebyly ve views, ale v databázi (kvůli editačnímu systému – v současné době to mám v souborech a je to pruda), a pak je tu komplikace s těmi jazykovými mutacemi – každý druhý web, který dělám, je vícejazyčný… Na takovouhle variantu jsem nikde žádný tutoriál nenašel, nebo jsem slepec… Takže zatím věštba & pokus/omyl…
pokud jsi dělal nějaký vícejazyčný web, tak by jsi mohl znát gettext
pro ten má Nette doplněk, pokud nemáš přístup na server, tak abys
využíval gettext, tak asi používáš nějaký systém konstant, polí apod.
Ať tak nebo tak, pořád pracuješ v podstatě s modelem a práce s modelem
ti asi už bude jasná… K návrhu presenterů – David má na svém blogu
v kategorii Nette takový článeček, jak je správně navrhovat, je dobře
napsaný a inspirativní. Stránky ve View, ale v databázi. Tak jak to psal
Honza Tvrdík, jen si tuto svou šablonu vytáhneš a při výpisu pomocí
!
zamezíš escapování.
A k těm tutorialum v distribuci s nette jsou ukázkové aplikace, pokrývají relativně velkou problematiku nette obecně, pak jsou tady další tutorialy, dokumentace pro programátory a pak jestě API dokumentace k pochopení jak psát to stačí, ale pokud chceš vědět, jak Nette funguje uvnitř, tak to tady moc není, aspoň z mého pohledu a to mě mrzí…
- net-vor
- Člen | 35
Můžu se ještě zeptat, jestli jsou nějaké zvláštnosti pro generování
404 stavu? Když v presenteru nenačtu žádná data ( = stránka neexistuje)
a snažím se vyhodit
throw new BadRequestException('Stránka nenalezena.', 404)
, tak mi
to hlásí, že class BadRequestException not found, přestože podle
dokumentace
evidentně existuje…
Editoval net-vor (21. 10. 2010 10:55)
- net-vor
- Člen | 35
Mám ještě jeden problém, a to generování položek menu. Jedna možnost
je napsat to natvrdo do šablony, ale to je otrava, druhá je vygenerovat si
nějaké pole s odkazy a iterovat v pohledu, přičemž ale url těch odkazů
budu definovat „ručně“ a v případě změny rout to potom musím
předefinovat i tady (řekněme, že se třeba rozhodnu, že web.cz/en/contact
budu chtít změnit na web.cz/page/en/contact (tedy z routy
[<lang [a-z]{2}>/]<slug>
na routu
<presenter>/[<lang [a-z]{2}>/]<slug>
)), třetí
možnost je – zřejmě – použít nějak ty chytré generátory odkazů,
které Nette nabízí a které umožňují nastavit URL až jako poslední.
Jak to udělat, abych se držel ve frameworku a odkazy se mi generovaly (asi přímo v pohledu)? Řekněme, že v modelu tahám z databáze všechny „stránky“ pro daný jazyk a ukládám to např. do
<?php
array(
1=>array('url'=>'kontakt', 'menu_item'=>'Kontaktní informace'),
2=>array('url'=>'o-nas', 'menu_item'=>'O nás')
)
?>
Jak byste navrhli výpis takovéhoto pole do šablony? Jinak princip aplikace je stejný, jak navrhl Honza Tvrdík výše. Kdybych nebyl srozumitelný, zkusím to vysvětlit lépe… Mým cílem je něco ve stylu
{foreach $menuItems as $item}
<a href="{plink Page:show:item[url]}">{$item['menu_item']}</a>
{/foreach}
ale samozřejmě funkčního, trochu se peru se syntaxí, takže se omlouvám za znásilňování