Nezobrazují se Flash messages při použití AJAX

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

Ahoj,

píši svoji první aplikaci podle quickstartu, všechno funguje až na flash messages, který se při použití AJAXu nezobrazí. Postupoval jsem přesně podle quickstartu, invalidaci mám v BasePresenteru v metodě beforeRender. Bez AJAXu fungují v pohodě.

Editoval potty (1. 3. 2012 18:17)

David Zadražil
Člen | 62
+
0
-

Takhle se to špatně odhaduje. Zkus nám sem dát zdrojáky.

potty
Člen | 13
+
0
-

BasePresenter:

<?php
public function beforeRender()
{
	if ($this->isAjax()) {
		$this->invalidateControl('flashMessages');
	}
}
?>

@layout.latte:

{snippet flashMessages}
	<div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>
{/snippet}

Komponenta PlayerList.php

<?php
public function handleParticipate($trainingId, $playerId, $isParticipate)
    {
	...
	$this->flashMessage('Nastavení uloženo.');
	if (!$this->presenter->isAjax()) {
	    $this->presenter->redirect('this');
	} else {
	    $this->invalidateControl();
	}
    }
?>

ajax.js:

<script type="text/javascript">
jQuery.ajaxSetup({
    cache: false,
    dataType: 'json',
    success: function (payload) {
        if (payload.snippets) {
            for (var i in payload.snippets) {
                $('#' + i).html(payload.snippets[i]);
            }
        }
    }
});

// odesílání odkazů
$('a.ajax').live('click', function (event) {
    event.preventDefault();
    $.get(this.href);
});

// odesílání formulářů
$('form.ajax').live('submit', function (event) {
    event.preventDefault();
    $.post(this.action, $(this).serialize());
});
</script>

Editoval potty (1. 3. 2012 20:51)

llsm
Člen | 121
+
0
-

Quickstart neni jeste dodelany, ale svoji odpoved najdes v nasledujicim videu

potty
Člen | 13
+
0
-

Díky za video, podle něj jsem to opravil.

V komponentě místo:

<?php
$this->flashMessage('Nastavení uloženo.');
?>

jsem dal:

<?php
$this->presenter->flashMessage('Nastavení uloženo.');
?>

Ještě k tomu videu (v tomto čase), je použita metoda processChange() a v metodě nad ní je napsáno $this->onChange(); Zkoušel jsem to, ale nic to nedělá. Co přesně tahle metoda znamená? Díky.

llook
Člen | 407
+
0
-

Tu metodu má pravděpodobně někde (nejspíš v konstruktoru) zaregistrovanou jako handler události onChange, to se dělá takhle:

$this->onChange[] = callback($this, 'processChange');

Když potom zavoláš $this->onChange(), tak Nette udělá kouzlo a zavolá postupně všechny callbacky uložené do pole $this->onChange. Popsané je to zde: https://doc.nette.org/…/smartobject#…