Jak nastavit defaultní action pro presenter?
- maarlin
- Člen | 207
Existuje nějaký způsob, jak nastavit defaultní action pro konkrétní presenter?
Pokud někde směruji např. na //Articles:
, tak se to
automaticky chápe jako //Articles:default
.
Zřídkakdy nechávám actions pojmenované default už jen z toho důvodu,
že to nic moc neříká o samotném účelu dané action… Např. u
Articles
presenteru je pro mě defaultní action
„list
“ (= seznam článků).
Jde nějak donutit routy, aby chápaly list
action jako
výchozí?
Mám následující routy:
$router[] = new NRoute('articles/<action>', array (
'presenter' => 'Articles',
'action' => 'list'
));
$router[] = new NRoute('<presenter>/<action>', array (
'presenter' => 'Homepage',
'action' => 'default',
));
Pokud přesměrovávám skrz $this->redirect(‚//Articles:‘);, tak to odchytí kupodivu až ta druhá routa, a u té první napíše, že by mohla vyhovět… přestože jsou v uvedeném pořadí.
Editoval maarlin (27. 4. 2011 11:07)
- na1k
- Člen | 288
Defaultní action se bere podle rout, přesně jak píšeš.
Proč ale nematchne první routa mi není jasné. Napadá mě snad jen to použití absolutní adresy (lomítka v Nette linku), kdy jsou možná pravidla pro generování adresy jiná.
Zkoušel jsi je dát pryč? A máš vůbec nějaký důvod používat v aplikaci absolutní cesty? Já jsem to využil jen při generování obsahu newsletteru s linkem na konkrétní presenter/action; jinak nikdy.
- maarlin
- Člen | 207
Zkusil jsem to chování nasimulovat na poslední verzi Nette, která se dá stáhnout mimo Git a chová se to stejně…
PHP 5.3.5
Server Apache/2.2.17 (Win32) PHP/5.3.5
Nette Framework 2.0-dev
bootstrap.php
$router = $application->getRouter();
$router[] = new NRoute('index.php', 'Homepage:default', NRoute::ONE_WAY);
$router[] = new NRoute('articles/<action>', array(
'presenter' => 'Articles',
'action' => 'list'
));
$router[] = new NRoute('<presenter>/<action>[/<id>]', 'Homepage:default');
ArticlesPresenter.php
class ArticlesPresenter extends BasePresenter
{
public function renderList()
{
$this->template->anyVariable = 'any value';
}
}
HomepagePresenter.php
NDebug::barDump($this->link('//Articles:'));
Dumpovaná hodnota
.../articles/default
Proč tam vynucuje /default
, když výchozí action by podle
routy měla být list
?
Editoval maarlin (2. 5. 2011 16:02)
- Mikulas Dite
- Člen | 756
To je default vždy.
Definované v https://github.com/…resenter.php#L47
Použité v https://github.com/…rs/Route.php#L123
- maarlin
- Člen | 207
Mikulas Dite napsal(a):
To je default vždy.
Definované v https://github.com/…resenter.php#L47
Použité v https://github.com/…rs/Route.php#L123
Aha, díky za nasměrování, nicméně já to vnímám jako bug… nebylo by lepší, kdyby to bralo default action z routy?
- Martin
- Člen | 171
Ahoj. Nemám čas to teď projíždět, ale zběžným podíváním do konstruktoru routeru mám naopak pocit, že defaultní hodnota se bere jen v případě, že druhý parametr neobsahuje dvojtečku jinde než na konci (tedy když nemá uvedenu akci). Chyba bude spíš v tom, že to první routu ignoruje, ale pak jí to označí jako použitelnou.
- Martin
- Člen | 171
Teď jsem to vyzkoušel v nejnověším 2.0 dev pro PHP 5.3 a jako defaultní se použije to, co uvedu v routě, pokud přesměrovávám přímo napsáním /articles do adresového řádku prohlížeče. Zkoušel jsi to? Naopak $this->redirect(‚//Articles:‘); přesměruje opravdu na default, začínám věřit, že by vážně mohlo jít o bug. Stane se to na řádku
// PROCESS ARGUMENTS
if (is_subclass_of($presenterClass, __CLASS__)) {
if ($action === '') {
$action = self::DEFAULT_ACTION;
}
v presenter.php.
Takže shrnu:
- Routa je dobře.
- Presenter ale opravdu použije jinou, protože si ještě dřív dosadí defaultní akci.
- Možná to není bug, ale feature :-)
Zítra se na to podívám pořádně.
- Martin
- Člen | 171
Ale jen tak selským rozumem – rout na jeden presenter může být víc a když by je projížděl od první, vzal by jako defaultní první akci, kterou najde. Pokud nenajde, dosadí svůj default. Ale je fakt, že by pak ty routy v podstatě asi v takovém případě projížděl dvakrát a to není zrovna OK.
Editoval Martin (3. 5. 2011 2:25)