Běžná situace - potřebujeme na stránce generovat desítky adres, které se liší hodnotou jediného parametru. Když je budeme skládat metodou $router->url(), musí se pokaždé hledat odpovídající routa a zbytečně se tak zpomaluje aplikace. Lepší by bylo najít správnou routu jen jednou a pak už jen pomocí str_replace dosazovat hodnoty. A přesně k tomu slouží dvojice metod prepareUrlTemplate() a urlFromTemplate().
$router = new Router; $router->addRoute('/:controller<skupiny>/:action/:nazev'); $router->prepareUrlTemplate('profilySkupin', array( 'controller' => 'skupiny', 'action' => 'detail', 'nazev' => Router::PREPARE, )); $data = array('Pink_Floyd', 'Jethro_Tull', 'Collegium_Musicum', 'Omega', 'Stromboli'); foreach ($data as $skupina) { echo $router->urlFromTemplate('profilySkupin', $skupina); }Výsledek:
/skupiny/detail/Pink_Floyd /skupiny/detail/Jethro_Tull /skupiny/detail/Collegium_Musicum /skupiny/detail/Omega /skupiny/detail/Stromboli
Pokud je u variabilní části routy zadaný regulár, je potřeba ke konstantě Router::PREPARE přidat i hodnotu, která bude odpovídat tomu reguláru (jinak by selhalo to první a jediné generování URL). Pořadí konstanty a výchozí hodnoty je libovolné. Výchozí hodnota je určená konstantou Router::DEFAULT_VALUE.
$router->addRoute('/:controller/:action/:id<\\d+>'); $router->prepareUrlTemplate('produktInfo', array( 'controller' => 'product', 'action' => 'detail', 'id' => '1' . Router::PREPARE, )); $ids = array(123, 78, 345678, 2, 5); foreach ($ids as $id) { echo $router->urlFromTemplate('produktInfo', $id); }Výsledek:
/product/detail/123 /product/detail/78 /product/detail/345678 /product/detail/2 /product/detail/5
Pokud máme routy, ze kterých se určitě nikdy nebude dělat šablona URL, můžeme o tom router informovat flagem Route::FIXED. Při vytváření šablony URL bude takové routy přeskakovat.
$router->addRoute('/:controller<specielni>/:action', array(), Route::FIXED);
NB: Router umí pracovat pouze s jednou doplňovanou hodnotou. Pokud použijeme Router::PREPARE na více místech, všude se doplní stejná hodnota.
A ještě příklad na dosazování hodnoty do query string, např. pro stránkovaný výpis výsledků nějakého vyhledávání:
$router->addRoute('/:controller<vyhledavani>/:kategorie'); $urlParams = array( 'controller' => 'vyhledavani', 'kategorie' => 'knihy', ); $pocetStran = 5; $router->prepareUrlTemplate('strana', $urlParams, array('strana' => Router::PREPARE)); for ($i = 1; $i <= $pocetStran; $i++) { echo '<a href="' . $router->urlFromTemplate('strana', $i) . '">' . $i .'</a>'; echo ($i !== $pocetStran ? ' | ' : ''); }Výsledek:
<a href="/vyhledavani/knihy?strana=1">1</a> | <a href="/vyhledavani/knihy?strana=2">2</a> | <a href="/vyhledavani/knihy?strana=3">3</a> | <a href="/vyhledavani/knihy?strana=4">4</a> | <a href="/vyhledavani/knihy?strana=5">5</a>
Poslední aktualizace: 24. 6. 2012 15:54