Nested tree routa – jde to?

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

Ahoj,

resim, jestli by slo udelat v nette routu, ktera by se skladala na zaklade definice a zanoreni stromu kategorii.

Pro priklad:

www.domena.cz/…/akce/auto_1
www.domena.cz/…/akce/auto_1
www.domena.cz/…em/produkt_2
atp.

Jde mi o to, abych jednotlive podkategorie konkretniho zanoreni mohl generovat dynamicky… pricemz hloubka zanoreni pro jednotlive podkategorie muze byt libovolna…

Mohlo by to vypadat treba i nejak takto:

www.domena.cz/…at7/produkt1

Jeste doplnim, ze cela definice stromu kategorii je v databazi a routy se musi se tudiz generovat odtamad…

Muze me nekdo nasmerovat na nejake pekne a elegantni Nette reseni?

Diky za cokoliv,

@flexroad

Editoval flexroad (14. 3. 2015 22:19)

echo
Člen | 134
+
+2
-

Zdravím, tuším, že nejlepší bude na míru implementovat IRouter.

Editoval echo (14. 3. 2015 22:17)

flexroad
Člen | 117
+
0
-

@echo: Jojo. Presne o to se snazim. Spise me zajimal nejaky best practice, jestli to uz nekdo resil…

Aurielle
Člen | 1281
+
0
-

Tady na fóru je o tom několik témat, nicméně jsou docela stará.

Tharos
Člen | 1030
+
0
-

@flexroad Pokud bys chtěl nějakou relativně čerstvou ukázku databázového routeru, jeden hodně jednoduchý můžeš najít tady.

Další neotřelou možností, jak takové routování řešit, je dynamicky generovat instance Route podle dat v databázi. Měl jsem to naimplementované v jednom CMSku před léty a fungovalo to velmi dobře. Dalo se to krásně kešovat, takže v praxi se s databází komunikovalo jen minimálně.

echo
Člen | 134
+
+1
-

Další možností by bylo ukládat v databázi nestovanou cestu jako string a ten pak přímo porovnávat – odpadnou tak složité dotazy na databázi a routu můžeš definovat klasicky pomocí Route(‚<nestedPath>‘)

thm
Člen | 147
+
+1
-

Před půl rokem jsem to řešil takto. Jako poslední routu jsem nastavil (žere všechno – jak jsem tak pochopil)

$router[] = new Route('<page .+>/', 'frontEnd:page:view');

A potom ve view to zpracovávám:

// V parametru $page je například: auto/skoda/octavia
public function actionView($page){
	$pageNames = array_reverse(explode('/', $page));
	try{
		$this->page = $this->pages->findBy('name',$pageNames[0]);
	} catch(...){}
}

Editoval thm (16. 3. 2015 9:26)