NRoute – match toho, co bych nečekal
- maarlin
- Člen | 207
Mám definovánu následující routu:
$router[] = new NRoute('<lang>/<presenter>/detail/<id>', array(
'lang' => 'cs',
'presenter' => 'Articles',
'action' => 'detail',
'id' => NULL
));
A routa vyhoví i výchozí URL (bez parametrů – hlavní strana).
Přesto, že v URL není /detail/
, ani parametr
id
.
Po ní následuje sice tato routa:
$router[] = new NRoute('<lang>/<presenter>/<action>', array(
'lang' => 'cs',
'presenter' => 'Articles',
'action' => 'list'
));
Ta by vyhověla taky, resp. to je ta, která se má pro hlavní stranu použít, ovšem nepoužije, protože se to chytí na té první.
Asi jsem ještě stále nepochopil, jak routy v Nette fungují… je to fakt magie… :)
- Ondřej Mirtes
- Člen | 1536
A seš si jistý, že se matchne ta první? Zkoušels RoutingDebugger?
Jinak ty routy jsou natolik podobné, že by šly smrsknout do jedné, de facto by stačila jen ta druhá, pokud bys jí přidal nepovinný parametr <id>.
Zkus zde uvést seznam všech svých rout a zkusíme je zoptimalizovat, aby fungovaly, jak mají :)
- maarlin
- Člen | 207
Navíc je před nimi jen jediná, která se nematchne…
$router[] = new NRoute('index.php', array(
'presenter' => 'Articles',
'action' => 'list',
), NRoute::ONE_WAY);
Právě že matchnutí zjišťuji přes Routing debugger… a ten hlásí u té první s ID match (yes) a u té druhé taky (may).
Viz screen: http://kecej.cz/…debugger.png
Neřeším teď možnost smrsknutí do jedné routy, ale logiku – proč to bere ta první routa…
Editoval maarlin (15. 2. 2010 22:06)
- Ondřej Mirtes
- Člen | 1536
Prohodit určitě ne, routy musí být definovány od konkrétních po nejobecnější.
Místo té druhé a třetí routy dej jen tuto a dej vědět, jestli to funguje jak má.
$router[] = new NRoute('<lang>/<presenter>/<action>/<id>', array(
'lang' => 'cs',
'presenter' => 'Articles',
'action' => 'list',
'id' => NULL,
));
Editoval Ondřej Mirtes (15. 2. 2010 22:19)
- maarlin
- Člen | 207
Trochu jsem přemýšlel, co vlastně po routách potřebuji…
Jde o to, že chci zachovat klasické routy
(<presenter>/<action>/<any-param>), ale zároveň chci, aby
/article-%id% převzal konkrétní presenter a action, resp. view.
A už jsem evidentně přišel na to, v čem tkví můj problém. Trochu
jsem to poladil a sloučil do jedné routy.
Potřebuji napsat regulár, který vyhoví výrazu article-152365
(tedy article-%číslo%) a nevyhoví jinému výrazu – např.
articles
nebo list
.
Zkoušel jsem něco jako
url[/<presenter !(article-[0-9]*)>][/<action !(article-[0-9]*)>][/article-<id [0-9]*)>]
Ale asi to není úplně to ono…
Editoval maarlin (16. 2. 2010 14:23)
- Ola
- Člen | 385
Ta první routa matchne, protože parametr id je definován jako
nepovinný – u new Route slouží první parametr jako maska URL, druhý
jako pole výchozích hodnot, a dále tam jsou tuším nějaké flagy. Problém
je právě v pochopění výchozích hodnot – to pole určuje, co bude
v kterém parametru za předpokladu, že v URL nebude uveden. Onen
„adresář“ detail by musel být na začátku aby měl vliv na matchnutí
routy. Řešení tvého problému je tedy jednoduché – odebrat z pole
výchozích hodnot hodnotu s klíčem id
.