Změna výchozí hodnoty paramatru v závislosti
- Buri
- Člen | 15
Zdravím,
chci se zeptat, zdali je možné za běhu měnit výchozí hodnoty pro routy?
Mám routu
<?php
Route('[<presenter>/[<id>/[<action>/[<param>/]]]]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'default'
));
?>
a chci, aby se v případě url /presenter/ použila akce default a v případě /presenter/id/ použila akce view, ovšem aniž by se url změnila na /presenter/id/view/. Je to možné?
- bojovyletoun
- Člen | 667
Viděl bych to na 2 routy. Řešení bude určitě víc. Mám pocit, že [] závorky jsou zbytečné .
[<presenter>/[<id \d+>/[<action=view>/[<param>/]]]] ... bude první, bude
[<presenter>/[<id \d+>/[<param>/]]] ... 2. možnost první routy, ale view je pevné, (do meta dej action=>view)
[<presenter>/[<action=default>/[<param>/]]] ...druhá
- Buri
- Člen | 15
Tak jsem to nakonec vyřešil trošku oklikou:
<?php
/* Load routing table from config.neon */
$knownActions = array();
foreach(array('presenter', 'action') as $type){
$routing_table = array();
foreach(explode(",", $container->params[$type . "RoutingTable"]) as $item){
$item = explode(":", $item);
$routing_table[$item[0]] = $item[1];
if($type == 'action') $knownActions[] = $item[0];
}
Route::setStyleProperty($type,
Route::FILTER_TABLE,
$routing_table);
}
$router[] = new Route('[<presenter>/[<action '.implode('|', $knownActions).'>/[<id>/[<param>/]]]]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'default'
));
$router[] = new Route('<presenter>/<id>/[<param>/]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'view'
));
$router[] = new Route('[<presenter>/[<id>/[<action>/[<param>/]]]]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'default'
));
?>
Tohle je pro asi nejlepší řešení, protože stejně používám překladovou tabulku. Ale ve finále to nemusí vyhovovat každému.
- Ascaria
- Člen | 187
Tyhle routy fakt fungujou? To je dost divočina.
Co něco jako:
Route('<presenter>[/<action>][/<id [0-9]+>]/', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'default'
));
V libovolné metodě pak můžeš view měnit pomocí $this->setView(‚view‘);, například v beforeRender nebo startup.
Parametry se budou asi muset obejit bez uvedeni v routě. Je potřeba si uvědomit, že ne cela url by měla mít „cool“ tvar protože pak při dekódování url to nemusí vrátit paramerty správně, protože to proste nepozná kerej je kerej kvůlu absenci klíčů v url.
- Felix
- Nette Core | 1196
Idealni by bylo jak pise bojovyletoun..
<?php
Route('[<presenter>/[<action>/[<param>/]]]]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'default'
));
Route('[<presenter>/[<id>/[<action>/[<param>/]]]]', array(
'module' => 'frontend',
'presenter' => 'dashboard',
'action' => 'view'
));
?>
- Ascaria
- Člen | 187
Felix: a máš to vyzkoušené? pokud budu mít v adrese „/article/neco“, kde „neco“ je cokoli kromě lomítka, jak to pozná, jakou routu to má vybrat? Vybere to vždy první, ať tam je string, či integer. Podle mě je potřeba se nad tím zamyslet, udělat to jednou routou a inteligentně. Jak je tu někde psáno, lepší geniální nápad, než 10000 řádek kódu.
- Jan Tvrdík
- Nette guru | 2595
Buri wrote: Ono by úplně stačilo, kdyby se dal nějak vytvořit callback…