Dynamický router pro strom a routy na presentery

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

Ahoj,

mám podobný problém jako například Dynamická routa pro články. Mám stromovou strukturu a chtěl bych aby odkaz vypadal hezky (např. kategorie/subkategorie/) samozřejmě N zanoření.

Našel jsem návod v Kuchařce, ale nyní mi nechodí všechny odkazy typu „presenter/action/id“. Je nějaká možnost, aby routy fungovaly tak, že pokud nenajdou presenter, teprve poté předají práci presenteru Page?

Moje současné nastavení rout:

// Setup router
$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();

	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

	$router[] = new Route("<node>", array(
	    "presenter" => "Page",
	    "action" => "default",
	    "node" => array(
		Route::FILTER_OUT => NULL,
		Route::PATTERN => ".*?",
	    ),
	));

	$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');



};

(PHP 5.3. Nette 2.x)

Peetee
Člen | 75
+
0
-

Trochu jsem si s routama hrál. Napadlo mě, co třeba použít prefix pro routy „presenter/action“ (1). Splácal jsem toto:

// Setup router
$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();

	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

	$router[] = new Route("<id>", array( //2
	    "presenter" => "Page",
	    "action" => "default",
	    'id' => array(
		Route::FILTER_IN => callback('PageModel::uriToId'),
                Route::FILTER_OUT => callback('PageModel::idToUri'),
		Route::PATTERN => ".*?",
	    ),
	));

	$router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default'); //1




};

Problém je v tom, že pokud jsou routy v tomto pořadí, tak routy presenter/action (1) hází BadRequest, routy kategorie/podkategorie (2) fungují pěkně.

Pokud routy prohodím (tj nejdřív bude routa na presenter/action) tak mi to (překvapivě) nic nenajde v ‚PageModel::uriToId‘, kam by se to IMHO ani dívat nemělo.

Nenapadá Vás něco? Díky za každý nápad.

Peetee
Člen | 75
+
0
-

Nemá prosím někdo nějaký nápad? Já si s problémem pořád hraju, ale uspokojivé řešení jsem zatím nenašel. Můj zatím nejlepší nápad je umístit prefix před odkazy kategorie/podkategorie, funguje to pěkně, ale to vypadá velice divně.

Neexistuje nějaký způsob, jak do routy umístit podmínku, že routa bude platná pouze pro prezenter „page“. Díky za každý nápad.

Peetee
Člen | 75
+
0
-

Pokud by někdo řešil stejný problém, tak tak zatím nejlepší řešení, které jsem našel, je napsat si vlastní Router. Není to vůbec složitý, stačí, když bude implementovat rozhraní IRoute , trochu je to popsáno tady.

Důležité je, že v rámci vlastního rutru můžete psát podmínky, proto v constructUrl můžete zajistit, že se bude generovat pouze pro daný preznter apod.