Presenter::cre­ateRequest()

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

Zdravím, tuším že jsem objevil chybičku v Presenter::createRequest().

Popis situace: V AuthPresenteru při logoutu provedu redirect

$params = array('action' => 'action', 'id' => 'some-page');
$this->redirect(':Front:Homepage:', $params);

při sestavě rout:

$router[] = new Route('admin/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Dashboard',
	'action' => 'default',
	'id' => NULL,
));

$router[] = new Route('<id>/<action>', array(
	'module' => 'Front',
	'presenter' => 'Homepage',
	'action' => 'action',
	'id' => Environment::getService('Options')->menuDefault,
));

a následující hierarchii presenterů:

/AdminModule
	BasePresenter extends Presenter
	AuthPresenter extends BasePresenter
	DashboardPresenter extends BasePresenter

/FrontModule
	BasePresenter extends Presenter
	CacheablePresenter extends BasePresenter
	HomepagePresenter extends CacheablePresenter

A nyní k problému: probíhá přesměrování – můj AuthPresenter volá $this->redirect()PresenterComponent::redirect() → ten Presenter::link() → ten zase Presenter::createRequest() a někde zde dojde k tomu, že Presenter docpe jako pohled místo view právě default.

Problém vidím v následujícím bloku kódu :

// process arguments
if (is_subclass_of($presenterClass, __CLASS__)) {
	if ($view === '') {
		/*$view = $presenterClass::$defaultView;*/ // in PHP 5.3
		/**/$view = self::$defaultView;/**/
	}

	...

První podmínka je splněna (společný předek Presenter), druhá taky ($view je dosud prázdný) takže se tam vecpe self::$defaultView který je právě onen řetězec default. Presenter::$defaultView je natvrdo nastavený a nikde v Nette jsem nenašel nic co by ho měnilo.

Je tedy na mě abych si zajistil, že nastavím presenterům výchozí pohledy, nebo to zatím čaká na implementaci?
Ideální by asi bylo, kdyby si to presenter zjišťoval z routeru.

David Grudl
Nette Core | 8152
+
0
-

Něco jiného jsou výchozí hodnoty parametrů routy a něco jiného default view. V podstatě routování s tím nemá nic společného, redirect na :Front:Homepage: je vždy redirect na view s názvem default, lépe řečeno na view s názvem, který specifikuje statická proměnná NejakyPresenter::$defaultView. A tu je z technických důvodů nutné nechat v PHP < 5.3 na hodnotě default.