Routování – routa podle id stránky
- stpnkcrk
- Generous Backer | 190
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?
- Honza Marek
- Člen | 1664
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
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
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ší.
- stpnkcrk
- Generous Backer | 190
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 |