AbortException a redirect
- sin
- Člen | 82
Ahoj,
chtěl jsem aby kdyz nema nekdo opravneni tak se mu ani nezobrazil fomrular a
tak jsem na zacatek metody dal toto:
<?php
public function renderFormAdd()
{
if(!$this->presenter->user->isAllowed('news', 'add')){
$this->presenter->flashMessage("Nemáte oprávnění pro tuto akci");
$this->presenter->redirect("Default:");
}
...
}
?>
Ale takle mi to hazi AbortException
Nevim co s tim. Ta hlaska mi nic nerika. Koukal jsem ze se to tady i resilo
ale z niceho jsem to nepochopil…
- Filip Procházka
- Moderator | 4668
AbortException ti to ale neháže tady. Ulož výpis laděnky jako html stránku a někam ji nahrej a pošli odkaz
- Honza Kuchař
- Člen | 1662
Mrkněte jak funguje Presenter
a hned vám to bude
jasnější.
https://api.nette.org/…ter.php.html#218
tzn. výjimka se vyhazuje někde mimo Presenter::run()
- David Grudl
- Nette Core | 8218
Jestli si dobře pamatuju, stalo se ti to i na školení, že?
Tohle je velmi zvláštní stav a trošku mi to připomíná problém na hostingu Savana – tu výjimku totiž musí zachytit Application a je záhada, proč ji nezachytí. Můžeš sem poslat phpinfo? Nebo zkusit update na jinou verzi PHP? Připadně dát sem ke stažení celý image PHP + Apache + aplikace, aby se na to mohl podívat někdo další?
- LM
- Člen | 206
Není to tím že se redirect volá až při renderování šablony
(z RenderResponse), takže až po Presenter::run()
, a tak tu
vyjímku zachytí až Application a ta na AbortException nijak nereaguje? (viz
ten výpis
z debug, kde už je dokonce vidět výstup ze šablony)
Editoval LM (16. 2. 2010 18:28)
- David Grudl
- Nette Core | 8218
Ale proč Application na AbortException nijak nereaguje? Ten výpis z debugu už sám o sobě ukazuje, že je v PHP něco moc špatně.
- David Grudl
- Nette Core | 8218
Díky za nakopnutí, jsem vůůůůl :-)) Vůbec mě nenapadlo, že to může být znovuvyhozená výjimka, což call stack neodhalí.
sin napsal(a):
Do metod render() nedávej přesměrování, při renderování stránky už je na přesměrovávání pozdě.
- David Grudl
- Nette Core | 8218
No jasně, metody render<View>()
presenteru se volají
dřív, než vykreslování začne.