Souhrnný návod pro začátečníky – principy a routování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
net-vor
Člen | 35
+
0
-

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:

  1. 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ý.
  2. je nutné pro každou „stránku“ (míněna pouze ta content část), kterou chci vykreslit, zakládat samostatný presenter?
  3. 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
+
0
-

Možností je více, ale po prvotním přečtení zadání bych to napsal takto:

Presentery

  • PagePresenter
    • pohled akce view 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, vyhodit BadRequestException. V metodě renderView předat $this->page do šablony + předat informace o menu (asi komponenta)

Model

  • PageManager s jednou metodu find($slug, $lang), která vrací FALSE nebo DibiRow.

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
+
0
-

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
+
0
-

ad Jan Tvrdík Díky… Dva dotazy:

  1. 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?
  2. 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
+
0
-

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
+
0
-

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
+
0
-

net-vor napsal(a):

  1. 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“

  1. Při nalívání zdrojáku do view se vše převádí na htmlentities – jde to nějak vypnout?

https://latte.nette.org/cs/tags#…

Mesiah
Člen | 240
+
0
-

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
+
0
-

Jan Tvrdík napsal(a):

https://latte.nette.org/cs/tags#…

Voila – geniální, díky moc.

Ad Mesiah: o gettext jsem zavadil, ale mám problém si poskládat základní logiku, jak tohle všechno funguje, takže si na to zatím netroufám. Ale dík!

net-vor
Člen | 35
+
0
-

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)

Čelo
Člen | 42
+
0
-
<?php
throw new BadRequestException('Stránka nenalezena.', 404)
?>
net-vor
Člen | 35
+
0
-

Čelo napsal(a):

<?php
throw new BadRequestException('Stránka nenalezena.', 404)
?>

No to je právě to, co mi nefunguje, a hlásí to Class ‚BadRequestException‘ not found

Jan Tvrdík
Nette guru | 2595
+
0
-

Nepoužíváš verzi se jmennými prostory?

Čelo
Člen | 42
+
0
-

a nepoužíváš prefix verzi?

net-vor
Člen | 35
+
0
-

Mám verzi pro PHP 5.3, takže tipuji, že ne…

Čelo
Člen | 42
+
0
-

viz. Jan Tvrdík:

<?php
throw new Nette\Application\BadRequestException('Stránka nenalezena.', 404);
?>
net-vor
Člen | 35
+
0
-

Díky!

net-vor
Člen | 35
+
0
-

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í

net-vor
Člen | 35
+
0
-

To je neuvěřitelný, co tahle věc umí… Díky!