Jak funguje isSignalReceiver?

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

Zdravim, resim tu pouziti isSignalReceiver. Tato metoda by mela vratit true, pokud je volan signal z jejiho parametru,ne?
Mám tu následující jednoduchý příklad, který nefunguje… Pouzivam Nette Framework 2.0.4
default.latte:

{block content}
   <a n:href="markDone! 5">zavolej signal</a>
{/block}

HomepagePresenter.php:

<?php
use Nette\Application\UI\Form;

class HomepagePresenter extends BasePresenter
{
  public function renderDefault()
  {
      var_dump( $this->isSignalReceiver($this, 'handleMarkDone') );
  }

  public function handleMarkDone($id)
  {
      $this->presenter->redirect('this');
  }

}

isSignalReceiver vraci neustale false i po kliknuti na odkaz…

Nevedel by nekdo kde delam chybu? Diky

Ot@s
Backer | 476
+
0
-

Jednak zkus to bez toho prefixu handle, tj. $this->isSignalReceiver($this, 'markDone').

EDIT: Po zavolání signálu se provede redirect (nedojde to do renderu). Po následném reloadu stránky pak logicky naskočí false (v URL zmizel požadavek na signál). Zakomentuj si to přesměrování v signálu a uvidíš sám.

Editoval Ot@s (23. 8. 2012 11:14)

motorcb
Člen | 551
+
0
-

Ot@s napsal(a):

Diky za nakopnuti, ovsem stale nefunguje a vraci false:

	public function renderDefault()
	{
  var_dump( $this->isSignalReceiver($this, 'markDone') );
	}

public function handleMarkDone($taskId)
{
    $this->flashMessage('handle');
    //$this->presenter->redirect('this');
}
Jan Endel
Člen | 1016
+
0
-

markDone ⇒ MarkDone?

Ot@s
Backer | 476
+
0
-

Před beforeRender() se příznak vyvolaného signálu zruší. Pokud tedy chceš dát avízo do renderu, řešením bude nastavení vlastního příznaku v metodě zpracování signálu.

Edit: Má to svoji logiku. Signál by totiž měl provést něco nad úrovní pohledu, tj. změnit něco ve vypisovaných datech (CREATE/INSERT/UPDATE), poslat data pro AJAX atd… Používat signál pro přímé ovlivnění obsahu stránky (resp. mít signál v URL) je nehygienické.

Editoval Ot@s (23. 8. 2012 11:55)

motorcb
Člen | 551
+
0
-

pilec napsal(a):

ani velké písmeno nepomohlo :)

Ot@s:

Toto je pouze jednoduchý příklad pro ukázku aby bylo dobře vidět že to nefunguje…

public function renderDefault()
{
  var_dump( $this->isSignalReceiver($this, 'MarkDone') );
}

public function handleMarkDone($taskId)
{
    $this->flashMessage('handle');
    //$this->presenter->redirect('this');
}
Ot@s
Backer | 476
+
0
-

Toto je pouze jednoduchý příklad pro ukázku aby bylo dobře vidět že to nefunguje…

Ještě jinak – toto chování je na 99% záměr. Důvod (moje dedukce) viz výše.

Filip Procházka
Moderator | 4668
+
0
-

V momentě kdy se vykoná signál, tak se zahodí jeho data. Nemůžeš se tedy na signál ptát až po tom, co ho vykonáš (signál je dřív než render).

motorcb
Člen | 551
+
0
-

HosipLan a Ot@s:

Díky za vysvětlení, v action to funguje.
Máte u mne velký pivo :)