NRoute – match toho, co bych nečekal

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

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

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

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)

redhead
Člen | 1313
+
0
-

zkusils ty 2 prohodit?

Ondřej Mirtes
Člen | 1536
+
0
-

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)

redhead
Člen | 1313
+
0
-

Ondřej Mirtes napsal(a):

Prohodit určitě ne, routy musí být definovány od konkrétních po nejobecnější.

a jo, obrátil jsem to, jsem ale hlupan..

maarlin
Člen | 207
+
0
-

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)

maarlin
Člen | 207
+
0
-

Ondřej Mirtes napsal(a):

Prohodit určitě ne, routy musí být definovány od konkrétních po nejobecnější.

Ano, to je to, co jsem nevěděl. :-) Díky.

Ale imho by to nemělo vadit, když nějakou obecnou hodím před konkrétní, za předpokladu, že tomu udám nějaký tvar přes regex…

Ola
Člen | 385
+
0
-

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.