Dynamický router pro strom a routy na presentery
- Peetee
- Člen | 75
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
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
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
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.