Best practice – hierarchie presenterů, routování vs strurkura webu
- xificurk
- Člen | 121
Nazdar, chtěl bych se zde zeptat jaké jsou „best practice“ postupy pro vztah struktury webu (to, co vidí uživatel) a hierarchie presenterů, příp. vztah k routování.
Řekněme, že mám web, který má několik sekcí, v každé z nich několik stránek – nezanedbatelná část z nich je statického charakteru (až na nějaké ty vložené komponenty je jejich obsah kompletně v šabloně), jiné jsou kompletně dynamicky generované a můžou mít i další členění (třeba „stránka fotky“ obsahuje seznam galerií a možnost jejich zobrazení); plus samozřejmě takové ty stránky mimo tento rámec – Homepage, Mapa stránek…
Taková struktura přímo vybízí k převedení i do hierarchie presenterů – co sekce webu, to jeden modul, co stránka to presenter (+ vnitřní členění pomocí action/view). Všechny Presentery v modulu společného předka, který obstará společné věci pro danou sekci (naplnění obsahu menu 2. úrovně apod.). Routování potom má taky takový pěkný kompaktní tvar typu:
<?php
$router[] = new Route('<module>/<presenter>/<view>/', array(
'module' => 'Homepage',
'presenter' => 'Default',
'view' => 'default',
));
?>
Plus nějaké ty specifické routy např. pro zmiňovanou fotogalerii. Soubory se šablonami a presentery jsou pak přehledně uspořádané podle struktury webu, odkazy se tvoří intuitivním způsobem v podobě Sekce:Stranka:{další upřesnění}…
A teď, co mě na tomto postupu trápí a snad se dozvím vhodnější řešení:
- Pojmenování presenterů výchozích stránek každé sekce Default – můžu sice takové presentery pojmenovat nějakým popisnějším názvem, jenže pak je potřeba přidat routu pro každou sekci zvlášť s přednastavenou výchozí stránkou.
- Presentery statických stránek jsou v podstatě prázdné – podle poučky z článku o Návrhu struktury V jednom presenteru sdružujte jen ty pohledy, které používají společné komponenty a persistentní parametry. by bylo asi vhodnější tyto stránky sdružit pod nějaký společný presenter, jenže tím si člověk zavaří na komplikace v routování atd.
Takže otázka zní – jak z toho ven? Jaké jsou doporučené postupy? V dokumentaci i příkladech jsou pouzé jednoduché demonstrační příklady, nikde jsem nenašel ukázku a doporučení, jak řešit tento návrh na webu z reálného života. Předem díky za nasměrování.
- _Martin_
- Generous Backer | 679
Ahoj, vidím, že budu mít další námět na stránku do dokumentace =D
Tak tedy: v prvé řadě bych ti navrhl nepoužívat moduly
způsobem „modul = stránka“. Jejich využití (co jsem se prakticky setkal)
je spíše k rozdělení webu na frontend
a backend
(neboli veřejnou část a administraci). Pro samotné stránky
(Homepage, Sitemap,…) doporučuji používat přímo
presentery (HomepagePresenter
, SitemapPresenter
,…).
K tomu využiješ jednoduchou routu
$router[] = new Route('<presenter>/<view>/', array(
'presenter' => 'Homepage',
'action' => 'default', // v nových revizích se používá action místo view
));
Pokud jde o statické stránky, jednoduchým řešením je doplnit jednu routu a předchozí lehce upravit
$router[] = new Route('<presenter Sitemap|>/<action>', array(
'presenter' => 'Homepage',
'action' => 'default',
));
$router[] = new Route('<page>/', array(
'presenter' => 'Page',
'action' => 'default',
));
Samozřejmě, šlo by použít i vlastní router, ale v tomto případě je jednodušší použít dvě klasické routy. (Pokud nerozumíš parametrům u presenteru v první routě, mrkni do dokumentace – bude třeba k nim doplnit jména dalších presenterů)
Na závěr bych jen dodal, že anglické názvy stránek nemusí být vždy žádoucí, řešením je použít překladový slovník
Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
'mapa-stranek' => 'Sitemap',
));
$router[] = new Route('<presenter mapa-stranek|>/<action>', array( // všimni si, že do češtiny musím změnit i povolené tvary adres v routě
'presenter' => 'Homepage',
'action' => 'default',
));
$router[] = new Route('<page>/', array(
'presenter' => 'Page',
'action' => 'default',
));
- xificurk
- Člen | 121
_Martin_ napsal(a):
Ahoj, vidím, že budu mít další námět na stránku do dokumentace =D
Tak tedy: v prvé řadě bych ti navrhl nepoužívat
moduly
způsobem „modul = stránka“. Jejich využití (co jsem se prakticky setkal) je spíše k rozdělení webu nafrontend
abackend
(neboli veřejnou část a administraci). Pro samotné stránky (Homepage, Sitemap,…) doporučuji používat přímo presentery (HomepagePresenter
,SitemapPresenter
,…). K tomu využiješ jednoduchou routu
To používání modulů jsem opomněl zmínit… to mi taky trochu smrdí. Ale myslím, že jsme se trochu nepochopili – moduly jsem v uvedeném příklad nepoužíval systémem Modul = stránka, ale Modul = Sekce webu.
Myslím, že je rozumné, aby tvar URI mj. reprezentoval pozici
návštěvníka v navigační struktuře webu. Tedy (když odhlédnu od
návaznosti na Moduly, Presentery, view/action) měla URI tvar
/<section>/<subsection>/.../<page>/<optional parameters>/
,
ve výše uvedeném případě vlastně jen
/<section>/<page>/<optional parameters>/
.
Klíčový problém, se kterým si nevím moc rady je to, jak toto navázat na
hierarchii Modulů, Presenterů, view/action.
- _Martin_
- Generous Backer | 679
Aha, špatně jsem se vyjádřil, pod pojmem stránka jsem myslel onu sekci. Čili že máme třeba sekci Novinky a v ní stránky seznam novinek a jednotlivé novinky. Nicméně pořád mi přijde jednoduché tento systém realizovat pomocí presenterů a akcí:
- stránka seznamu novinek →
News::default()
- stránka konkrétní novinky →
News::show($id)
- může být i archiv novinek (což bude opět nějaký výpis)
→
News::archive()
Pro 99% případů je tohle dostačující způsob. Pokud jsi ale narazil na nějaký případ, kdy to nestačilo, sepiš to sem (třeba ukaž mapu stránek a mrknem na to).
- xificurk
- Člen | 121
_Martin_ napsal(a):
Aha, špatně jsem se vyjádřil, pod pojmem stránka jsem myslel onu sekci. Čili že máme třeba sekci Novinky a v ní stránky seznam novinek a jednotlivé novinky.
Myslím, že se stále nechápeme… výše jsem psal:
web, který má několik sekcí, v každé z nich několik stránek – nezanedbatelná část z nich je statického charakteru, jiné jsou kompletně dynamicky generované a můžou mít i další členění (třeba „stránka fotky“ obsahuje seznam galerií a možnost jejich zobrazení)
Čili v příkladě, který jsi psal ty sedí nad oněmi Novinkami ještě nějaká vyšší entita (sekce), tedy navigace po webu probíhá asi takto:
- Homepage
- Název sekce webu
- Výchozí stránka sekce
- Novinky
- Seznam novinek
- Článek číslo 1
- …
- …
- Jiná sekce webu
- …
V URI bych chtěl tuto strukturu kopírovat, tedy např. /nazev-sekce/novinky/clanek-blabla/. A teď jak toto napasovat na strukturu presenterů… tenhle problém prostě přestává mít jenoduché řešení v momentě, kdy struktura webu je trochu složitější než pár stránek s jedním hlavním menu. Myslím, že jeden příklad vydá za tisíc dalších slov, takže první tohoto typu, co mi přišlo pod ruku – http://krizovatka.skaut.cz
- _Martin_
- Generous Backer | 679
Jo až takhle složitá struktura… Potom to asi nepůjde jinak, než přes vlastní router. Sice by šla udělat routa, která by presenteru předala celou část za lomítkem (a on si to sám naparsoval a podle toho vysosal z DB), ale zase je pravda, že možná se na x-té úrovni může skrývat jiný presenter (a nikoliv jen statická stránka) a teď zjišťovat (a jak?) to v presenteru? To asi ne.
Ale myslím, že takhle složitý web tu nikdo neřešil, takže by stálo za to nad tím popřemýšlet (třeba i na blížící se poslední sobotě).
- xificurk
- Člen | 121
Jelikož na mě byl dotaz, jak jsem to nakonec vyřešil, tak shrnu můj aktuální stav (i když nevím nakolik ideální).
Mám několik Presenterů pro statické stránky (podle toho, jaké společné komponenty používají), více méně to odpovídá jednotlivým sekcím webu, plus samostatné presentery pro takové věci jako Blog, Fotogalerie…
Začlenění konkrétní stránky do hierarchie webu jsou kompletně
přesunul do šablon (s využitím {extends}
a
{assign}
) – jeden hlavní layout, ten dědí „sublayouty“
pro jednotlivé sekce webu, které mají za úkol si naplnit submenu a pár
dalších věcí, tyto sublayouty dědí jednotlivé šablony stránek
nezávisle na tom jaký presenter je renderuje.