Maskování nebo zastavení signálu

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

Zdravím,
lze nějak v Nette zamaskovat signál?
V BasePresenteru zkouším udělat jednoduchý autorizátor, ale narážím na problém jak zastavit další průběh aplikace.
Když vyhodím BadRequestException tak mi Nette hodí bsod (nečekaně), ale rád bych zobrazil pouze flashMessage.

Je to možné?
Díky za rady, tipy atp.

David Kudera
Člen | 455
+
0
-

BadRequestException je tak trochu ekvivalent pro 404, takže v produkčním režimu se místo tracy zobrazí nějaká tvoje pěkná stránka. Není to lepší, než zůstat na předchozí stránce a na ní jen zobrazit flash message?

CZechBoY
Člen | 3608
+
0
-

Jo chci zůstat na stránce a zobrazit flashMessage.
Jenže nevím jak mám zamezit vykonání toho signálu.

BasePresenter:

public function checkRequiremenets($element) {
 return false;
}

Tohle nefunguje :( když vyhodím exception tak bsod.

David Kudera
Člen | 455
+
0
-

V tom případě tu exception nevyhazuj a vyměň ji za flash message. Btw počítáš s tím, že třeba vyhledávače si budou i o neexistující stránce myslet, že existuje, když vrátíš něco jiného než 404?

Edit: na netu je o tom spousta článků a textů. Tady je jeden příklad z nich

Editoval David Kudera (30. 7. 2014 13:35)

mkoubik
Člen | 728
+
0
-

Normálně nastav flash message a přesměruj. Nebo v čem je problém?

CZechBoY
Člen | 3608
+
0
-

To bude stejně ajaxový hlasování :-)
Chci zobrazit hlášku, že musí být uživatel přihlášen.

No problém je v tom, že když přidám flashmessage tak se stejně vykoná signál.
Přesměrovávat přes ajax se mi ani moc nechce.

David Kudera
Člen | 455
+
0
-

Jo aha, tak u takových věcí se pak většinou jen jednoduše zavolá (u ajaxu s podmínkou a překreslením snippetu)

$this->redirect('this');

a přesměruje se, sice to může vypadat divně přes ajax, ale jde to.. druhá možnost je, že si překreslíš snippet s flash messages a přesměrovávat nebudeš.

Ale dost možná taky nechápu to „maskování“ signálu

Editoval David Kudera (30. 7. 2014 16:12)

CZechBoY
Člen | 3608
+
0
-

Jo snippet s flashMessage si překreslim, to jsem už vyřešil. Jenže potřebuju, aby se ta chráněná metoda nevykonala po zjištění, že uživatel na to nemá práva/není loglej.

Přesměrovávat kvůli blbý hlášky se mi fakt nechce.

mkoubik
Člen | 728
+
0
-

Tak tu metodu nevykonávej, ne?

public function handleSomething()
{
	if (!$this->allowed()) {
		$this->flashMessage();
		if ($this->presenter->isAjax()) {
			$this->redrawControl();
			return;
		} else {
			$this->redirect('this');
		}
	}
	$this->someMethod();
}
CZechBoY
Člen | 3608
+
0
-

No myslel jsem, že to půjde nějak obecně a nebudu muset u každý metody kontrolovat jestli je povolená.

Nakonec jsem to udělal přes forward/odklonění střely :D
v BasePresenteru, metoda checkRequirements:

if ($this->user->loggedIn == false) {
    $this->flashMessage('Pro tuto operaci musíte být přihlášen', 'info');
    $this->forward('Error:blank');
}

Při akci Error:blank se nic neděje, šablona:

{block content}{/block}

Pozor! metoda checkRequirements se volá dřív než startup, takže pokud máte nějaký nastavování ve startupu tak je dobrý ji zavolat třeba na začátku checkRequirement (nebo ne?)

Editoval CZechBoY (30. 7. 2014 20:30)

mkoubik
Člen | 728
+
0
-

A proč místo toho $this->forward('Error:blank'); nedáš if (!$this->isAjax()) { $this->redirect('this'); }? Stejně chceš po signálu přesměrovat, ne? Forward nic neřeší.

CZechBoY
Člen | 3608
+
0
-

Protože v ajaxovým požadavku mi to zpracuje ten signál (píšu asi po 3.).