Nekonecne volanie handle ajaxom
- duskohu
- Člen | 778
Caute viete mi poradit? mam komponentu v ktorej potrebujem v sablone nekonecne volat handle ajaxovo az dokym nieje splnena podmienka. Viete mi poradit ako to realizovat?
komponenta
public function handleEmailSend() {
// nejaka akcia
if ($this->presenter->ajax) {
if ($this->presenter->isAjax()) {
$this->invalidateControl('mailer');
} else {
$this->presenter->redirect('this');
}
}
}
public function render() {
$checkEmptyMailier = $this->mailerRepository->checkEmptyMailier(); // vracia TRUE|FALSE
$this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
$this->template->checkEmptyMailier = $checkEmptyMailier;
$this->template->render();
}
sablona komponenty
{snippet mailer}
// nieco vykreslujem
{if $checkEmptyMailier}
// volaj ajaxovo handle kym $checkEmptyMailier == TRUE
{/if}
{/snippet}
Editoval duskohu (16. 12. 2012 15:36)
- Vojtěch Dobeš
- Gold Partner | 1316
Já bych s nette.ajax.js
takový polling implementoval
následovně:
$.nette.ext({
success: function (payload) {
if (typeof payload.checkEmptyMailier !== 'undefined') {
this.status = payload.checkEmptyMailier;
}
},
load: function () {
if (this.status) {
// make ajax request...
}
}
}, {
status: true
});
$this->payload->checkEmptyMailier = $checkEmptyMailier;
Píšu jen obecně :).
- duskohu
- Člen | 778
Dakujem velmi pekne, inak $this->payload- mam umiestnit do render komponenty? lebo ak ano tak neviem co robim zle lebo mi vracia:
Cannot read an undeclared property AjaxMailerControl::$payload.
EDIT:
uz viem preco:
$this->presenter->getPayload()->checkEmptyMailier = $checkEmptyMailier;
Editoval duskohu (16. 12. 2012 17:57)
- duskohu
- Člen | 778
Uz mam len jeden problem:
Ked si dam v success alert(payload.checkEmptyMailier) tak mi stale vypisuje pri
1 cikle raz a v dalsom cikle 2 krat a tak dalej. Preco? Akoby sa ten payload
neprepisoval ale nabaloval.
Edit: lebo som ho mal v snippete.:-)
Editoval duskohu (16. 12. 2012 18:06)
- duskohu
- Člen | 778
Mam jednu ot. k tomuto kodu, asi mu nerozumiem dobre:
- ked sa spusti load alert mi vrati hodnotu true, (defaultne je nastavena)
- potom nastane success alert(payload.checkEmptyMailerList) sa nevypise, preco? v render som ho nastavil
- vypise sa true v load, kedze sa podmienka v success nevykonala
- potom zase success tu uz vypise hodnotu 0
- a nasledne v load false kedze uz bola splnena podmienka na zmenu this.status
- a nasledne vypise 0.
Preco na zaciatku musi prebehnut jedna iteracia lebo v payload.checkEmptyMailerList nie je hodnota?
v render metode mam:
$this->presenter->payload->checkEmptyMailerList = 0;
sablona
$.nette.ext({
success: function (payload) {
alert(payload.checkEmptyMailerList);
if (typeof payload.checkEmptyMailerList !== 'undefined') {
if(payload.checkEmptyMailerList <= 0 ){
this.status = false;
}else{
this.status = true;
}
}
},
load: function () {
alert(this.status);
if (this.status) {
$.nette.ajax({
url: {link emailSend!}
});
}
}
}, {
status: true
});
Editoval duskohu (17. 12. 2012 14:33)
- Vojtěch Dobeš
- Gold Partner | 1316
Zkus mi to ještě trošku popsat, kdy má kde být jaká hodnota – trochu se v tom aktuálním popisu ztrácím.
- duskohu
- Člen | 778
Oki tak v render metode v mojej komponente si nastavim checkEmptyMailerList teraz len koli testu som mu dal hodnotu 0 ale inak vracia cislo z modelu.
$this->presenter->payload->checkEmptyMailerList = 0;
a v sablone mam
$.nette.ext({
success: function (payload) {
alert(payload.checkEmptyMailerList);
if (typeof payload.checkEmptyMailerList !== 'undefined') {
if(payload.checkEmptyMailerList <= 0 ){
this.status = false;
}else{
this.status = true;
}
}
},
load: function () {
alert(this.status);
if (this.status) {
$.nette.ajax({
url: {link emailSend!}
});
}
}
}, {
status: true
});
a toto mi stale dookola vracia [true,true,undefined], >>toto sa uz len
opakuje [true,undefined] [true,undefined]…
true vypise v load a undefined v success, ten payload.checkEmptyMailerList sa
v render metode asi nenastavi a pri prvom success neprejde cez podmienku
„undefined“ tym padom nemozem zmenit stav na this.status= false.
Alebo to ma tak fungovat? ze pri prvom success payload este neexistuje?
Editoval duskohu (17. 12. 2012 15:35)
- Vojtěch Dobeš
- Gold Partner | 1316
Hm, ty nastavuješ tu proměnnou do payloadu v render metodě, hej? Nicméně ajaxový požadavek děláš na co? Na nějakou handle metodu?
- duskohu
- Člen | 778
ano na nejaky handle, ten handle je tiez v komponente kde mam render.
public function handleEmailSend() {
// nejaka akcia
if ($this->presenter->ajax) {
if ($this->presenter->isAjax()) {
$this->invalidateControl('mailer');
} else {
$this->presenter->redirect('this');
}
}
}
public function render() {
$this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
$checkEmptyMailerList = 0; // tu sa pripojim na model a zistim aktualne cislo
$this->presenter->payload->checkEmptyMailerList = $checkEmptyMailerList;
$this->template->render();
}
Editoval duskohu (17. 12. 2012 15:37)
- Vojtěch Dobeš
- Gold Partner | 1316
Hm… obalil bych to nastaveni paylodu podmínkou
$this->presenter->isAjax()
a v té samé podmínce hned
potom provedl sendPayload()
.
- duskohu
- Člen | 778
oki teraz mi to vracia >> true, true, 0, false, 0
- prve truje je normalne lebo je defaultne nesatvene to urobi v load
- potom success >> malo by si zistit hodnotu z payload.checkEmptyMailerList ze je 0 hodnota a na zaklade nej nastavit this.status = false, ale miesto toho vypise true, takze v ten alert v success sa ani nespusti, miesto toho vypise true v load
- potom vypise 0 success to uz naslo payload.checkEmptyMailerList a nastavi this.status = false
- vypise v load false to je tiez dobre
- a nasledne v success 0 to je taktiez dobre
Problem je v tom ze 1 iteracia prebehne lebo na zaciatku nenaslo payload.checkEmptyMailerList
public function render() {
$this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
$checkEmptyMailerList = 0;
if($this->presenter->isAjax()){
$this->presenter->payload->checkEmptyMailerList = $checkEmptyMailerList;
$this->presenter->sendPayload();
}
$this->template->render();
}
- duskohu
- Člen | 778
Chcel by som sa spytat ako by sa dal tento priklad riesit zapomocoi Dynamickych snippetov v komponente ako je to tu: https://doc.nette.org/…mic-snippets, teraz mam tu extenzi v komponente, ale ked mam viac komponent tak bude aj kod extenze viackrat na stranke. Takze ho presuniem do head v sablone, ale tym padom neviem ako si posielat linku na handle. Tiez to mam robit cez $this->presenter->payload ?
Editoval duskohu (18. 12. 2012 13:42)
- Vojtěch Dobeš
- Gold Partner | 1316
Jakékoliv extenze pro nette.ajax.js
bys měl mít ideálně
v externím javascriptovém souboru, ne napláclé v šabloně a ještě
k tomu vypisované v cyklu :).
Ad posílaná adresa… uvědom si, že payload je soubor dat, který se ti
vrátí při ajaxovém požadavku. Ale při načtení stránky se žádný
požadavek neprovádí, tudíž žádný payload ještě logicky nikde
nepřišel. Data (ten link na signál) si hoď třeba do datového atributu na
<body>
nebo něco podobného, a v load
callbacku
si ho načti.