Jak funguje isSignalReceiver?
- motorcb
- Člen | 551
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
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
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');
}
- Ot@s
- Backer | 476
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
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');
}
- Filip Procházka
- Moderator | 4668
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).