Routování – routa podle id stránky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
stpnkcrk
Generous Backer | 190
+
0
-

Mám v systému (databázi) několik stránek a chci, aby na tři konkrétní (v mém případě uvod, kdo-jsem a kontakt vedla adresa /<id> a na zbytek adresa /stranka/<id>, ovšem netuším jako toho docílit.

Nastavení routeru mám následující:

<?php
$router[] = new Route('//' . $domain->steven . '/<id uvod|kdo-jsem|kontakt>', array(
	'presenter' => 'Steven:Page',
	'action' => 'default',
	'id' => 'uvod',
));

$router[] = new Route('//' . $domain->steven . '/stranka/<id>', array(
	'presenter' => 'Steven:Page',
	'action' => 'default',
));
?>

Doufal jsem, že když je v první routě určeno, které id (ono uvod|kdo-jsem|kontakt), pro nevyhovující odkazy se tato routa nepoužije.

A ejhle, ono se pro generování použije první routa, která ovšem neakceptuje jiný parametr <id>, než který je vyjmenovaný. Jak z toho ven?

phx
Člen | 651
+
0
-

Mozna by to vyresili celkem 4 routy. 3 ty specialni a 1 univerzalni.

Honza Marek
Člen | 1664
+
0
-

Asi by nebyl problém udělat si vlastní routu. Když jsem to zkoušel, tak mě překvapilo, že to není tak težké, jak jsem myslel.

Ondřej Mirtes
Člen | 1536
+
0
-

Podobnou věc jsem řešil a stačilo si akorát hrát s tím nepovinným parametrem (zrušit ho, dát mu NULL, zkusit ho přidat do té druhé routy), nakonec jsem to nějak rozchodil. Taky jsem použil výčet těch řetězců, na které se to má matchnout (oddělených |).

_Martin_
Generous Backer | 679
+
0
-

Zvláštní, tak jsem si udělal web, kde mám přesně tyhle dvě routy, a odkazy se generují zcela podle plánu. Kód v šabloně

<ul>
	<li><a href="{link this 'uvod'}">{ifCurrent this 'uvod'}<strong>Úvod</strong>{else}Úvod{/if}</a></li>
	<li><a href="{link this 'kdo-jsem'}">{ifCurrent this 'kdo-jsem'}<strong>Kdo jsem</strong>{else}Kdo jsem{/if}</a></li>
	<li><a href="{link this 'reference'}">{ifCurrent this 'reference'}<strong>Reference</strong>{else}Reference{/if}</a></li>
	<li><a href="{link this 'kontakt'}">{ifCurrent this 'kontakt'}<strong>Kontakt</strong>{else}Kontakt{/if}</a></li>
</ul>

vypíše pěkně

<ul>
	<li><a href="/web-skeleton/"><strong>Úvod</strong></a></li>
	<li><a href="/web-skeleton/kdo-jsem">Kdo jsem</a></li>
	<li><a href="/web-skeleton/stranka/reference">Reference</a></li>
	<li><a href="/web-skeleton/kontakt">Kontakt</a></li>
</ul>

Tak ti nevím – nemáš tam ještě další routy? Či jakou verzi Nette používáš? Testoval jsem to na nejnovější.

David Grudl
Nette Core | 8218
+
0
-

Nemůže být problém v té části s doménou a $domain->steven ?

stpnkcrk
Generous Backer | 190
+
0
-

Ono dohromady tam je mnohem více rout, ale na presenter :Steven:page ukazují jen tyhle dvě.

David: Jaký problém by mohl být v části $domain->steven?

Ola
Člen | 385
+
0
-

No pokud tam máš někde třeba parametr <presenter> tak je jedno, že tahle routa ho má jako výchozí..

stpnkcrk
Generous Backer | 190
+
0
-

Dostal jsem se z Francie domů, tak jsem to zkusil na domácím serveru. A doma mi to funguje (všechno kromě těch 3 <id> se generuje a akceptuje na /stranka/<id>, ale na hostingu ne. Tušíte někdo, kde by mohl být zakopaný pes?

stpnkcrk
Generous Backer | 190
+
0
-

Tak jsem ještě trochu experimentoval a přišel jsem na zajímavou věc. Jen nevím, zda-li je to bug nebo záměr.

Chování je totiž následující:

Pokud je id stránky jedno z těch tří, které jsou specifikované pro adresu /<id>, použije se. Pokud je id úplně jiné, použije se routa /stranka/<id>. Pokud ale to id začíná jedním z těch tří řetězců, použije se první routa pro vytvoření odkazu, která ovšem takovýto parametr neakceptuje.

Možná to není moc srozumitelné, proto pro ukázku pár příkladů:

{link :Steven:Page 'kontakt'} /kontakt
{link :Steven:Page 'zkouska'} /stranka/zkouska
{link :Steven:Page 'kontakt-nova-verze'} /kontakt-nova-verze
David Grudl
Nette Core | 8218
+
0
-

opraveno