Struktura projektu při vlastním databázovém menu
- Miri
- Člen | 117
Ahoj,
chtěl bych se zeptat na rady zkušených, jak řešíte routery, když máte vlastní menu v databázi. Jak využíváte presentery? Při starším projektu jsem používal poze jeden presenter, kde jsem renderoval jen podle svého menu, nemyslím si že je to tak v pořádku. Máte jiné zkušenosti?
Díky Míra
- amik
- Člen | 118
tak záleží, co za menu to je, mít hlavní navigaci webu v databázi není moc obvyklé a ani moudré, je to součást aplikace, nikoli datového modelu. Pokud máš ale opravdu rozumný důvod mít menu v databázi, nejčistší řešení je napsat si vlastní router, který se do databáze umí dívat.
- amik
- Člen | 118
Zákazník si možná konfiguruje menu, ale určitě ne presentery a akce. Pokud tedy v menu jsou např. články, měly by se všechny routovat např. Articles:detail a ident článku se předá prostě jako parametr. O který jde článek už pak neřeší router, ale přímo ArticlesPresenter. Router nemusí s databází nijak komunikovat.
Pokud máš na mysli, že si zákazník chce konfigurovat tvar url adresy, tedy např. jestli se na články dostane pod /blogposty/, /mojeplky/ nebo /clanky/, pak už je vhodné router s databází nějak spojit, ale to jsem z tvého dotazu nepochopil – znamenalo by to, že v databázi jsou routy , nikoliv menu.
„> Když bych si napsal vlastní router, pak by se stejně struktura
projektu nezměnila od mého původního.“
Jakože bys měl pořád jeden presenter? Proč? Pokud bys měl router, co se
umí dívat do databáze, mohl bys podle toho vybírat presenter. Router je
přece od toho, že překládá URL adresy na (Modul,Presenter,Akce,Parametry),
o menu se nijak nestará…
Možná sem pošli konkrétní příklad, jak si zákazník routy nastavuje, pořád si to neumím představit.
- Jan Suchánek
- Člen | 404
Pokud máš menu v databázi tak nepotřebuješ řešit routy, leda že bys chtěl používat pěkné url adresy a na to se stačí podívat na video o routování.
- Miri
- Člen | 117
amik:
Je to tak jak říkáš.
Dejme tomu takovéto url:
/cs/auta/ford/
/cs/motory/Chevrolet/
/cs/kontakty/
/en/cars/ford/
/en/contacs/
…
Jedná se o to, že zákazník si může vytvořit jakékoliv url. Teď to mám tak, že vždy načítám homepage:default a z toho hledám dál. Přijde mi to však dost nepraktické.
jenicek:
A jak se teda potom řeší presentery?
- llsm
- Člen | 121
Presentery si muzes resit jak chces, staci ti pak spravne (tj. jak zrovna potrebujes) provazat kazdou polozku menu s nejakou akci pozadovaneho presenteru. Nic ti prece nebrani, aby kazda polozka menu obsahovala v db i odkaz v nette formatu, ktery si pak routou prelozis jak chces.
- amik
- Člen | 118
Pokud si tedy zákazník může editovat URL, bude nejlepší si napsat buď vlastní router, který umí URL tahat z databáze. nebo jen obálku nad klasickou nette Route, která podle databáze vytvoří Route objekty, pseudokódem nějak takto:
class DBRouterFactory extends Nette\Object {
public static function createRoutes($router, $dbConnection) {
foreach ($dbConnection->somehowGetRoutes() as $route) {
$router[] = new Route($route->pattern, $route->link);
}
}
}
kde route->pattern je vlastně url a link je nettí link ve tvaru Modul:Presenter:akce
Rozhodovací logiku, jaký presenter použít, prostě z homepage presenteru přesuneš do této route továrničky (nevím, jak rozhodování o presenteru funguje, jestli je uložený v databázi, je na to nějaká kouzelná metoda nebo jinak).