Presenter::createRequest()
- romansklenar
- Člen | 655
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 | 8228
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
.