Jak nastavit defaultní action pro presenter?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maarlin
Člen | 207
+
0
-

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
+
0
-

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
+
0
-

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)

maarlin
Člen | 207
+
0
-

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
+
0
-

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.

David Grudl
Nette Core | 8218
+
0
-

Rout na jeden presenter může být víc a nešlo by určit, co je default.

Martin
Člen | 171
+
0
-

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:

  1. Routa je dobře.
  2. Presenter ale opravdu použije jinou, protože si ještě dřív dosadí defaultní akci.
  3. Možná to není bug, ale feature :-)

Zítra se na to podívám pořádně.

Martin
Člen | 171
+
0
-

Aha, než jsem to odeslal, máš tady odpověď – je to feature. Davide, nechceš udělat ajaxovou aktualizaci fóra? Takhle člověk než něco dopíše, je tam často jiná odpověď. Stačil by třeba malinký alert(‚někdo tady právě odpověděl‘);

Martin
Člen | 171
+
0
-

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)