Přesměrování z presenteru obsahující komponentu NiftyGrid
- sinner
- Člen | 20
Dobrý den,
při programování jsem narazil na takovou podivnost. Při přesměrování
nepřihlášeného uživatele z adresy
presenter/action/?shortNewsGrid-order=title+ASC&shortNewsGrid-perPage=50
dojde k chybě, protože se zavolá konstruktor datagridu (NiftyGrid) s nulovými argumenty.
Přesměrovávám, myslím standartně:
protected function startUp()
{
parent::startup();
if (!$this->user->isLoggedIn()){
$this->redirect('Sign:default');
}
}
Vytváření komponenty mám takovéto:
/**
* Creates component ShortNewsGrid
* @return ShortNewsGrid
*/
protected function createComponentShortNewsGrid()
{
return new ShortNewsGrid($this->shortNewsList, $this->shortNewsRepository);
}
Proč se volá konstruktor datagridu před vlastním přesměrováním, když přesměrovávám už v metodě startup, a jak to potlačit?
Děkuji všem za radu.
- duke
- Člen | 650
sinner napsal(a):
Proč se volá konstruktor datagridu před vlastním přesměrováním, když přesměrovávám už v metodě startup…
Protože u redirekce (tj. volání Presenter::redirect
)
převod 'Sign:default'
na cílové url počítá také (skrz
volání Presenter::saveGlobalState
) s persistentními
komponentami, ve kterých mohlo před voláním metody redirect
dojít ke změně. To, jak je to v Nette řešeno, nejspíš také souvisí
s kanonickými url.
sinner napsal(a):
…, a jak to potlačit?
Možná pomůže nahradit toto:
$this->redirect('Sign:default');
tímto:
$this->redirectUrl($this->link('Sign:default'));
Pokud to pomůže, je otázka, zda je toto chování Nette korektní…
- sinner
- Člen | 20
Filip Procházka napsal(a):
A odkud se ty dvě vlastnosti toho presenteru vezmou? Kde je plníš?
protected function startup()
{
parent::startup();
....
$this->shortNewsRepository = $this->context->shortNews;
...
}
public function actionShortNews()
{
$this->shortNewsList = $this->shortNewsRepository->getAll();
}
duke napsal(a):
sinner napsal(a):
…, a jak to potlačit?Možná pomůže nahradit toto:
$this->redirect('Sign:default');
tímto:
$this->redirectUrl($this->link('Sign:default'));
Pokud to pomůže, je otázka, zda je toto chování Nette korektní…
Pomohlo díky moc