Struktura projektu při vlastním databázovém menu

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

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

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.

Miri
Člen | 117
+
0
-

Řešení je to, že používám redakční systém a požadavky zákazníka jsou, aby si mohl sám menu měnit. Když bych si napsal vlastní router, pak by se stejně struktura projektu nezměnila od mého původního.

amik
Člen | 118
+
0
-

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

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

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

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

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).