Manuální překreslení snippetu

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

Zdravím, píšu funkcionalitu na schvalování a zamítání příspěvků pomocí Ajaxu. Při zamítnutí chci logovat důvod zamítnutí a proto musím udělat krok bokem a nemůžu použít nette.ajax stejně jednoduše jako při schvalování (viz poslední kód). Požadavek se pošle, všechno funguje, ale snippet s výpisem se mi překreslí až při reloadu stránky.
Napadá mě použít payload, kde mi skutečně v JSONu příjde ‚{„state“:[],„snippets“:{„snippet–list“:" (…)‘, a ten snippet si překreslit ručně, ale není nějaký jednodušší způsob?

Takhle vypadá můj javascript na posílání požadavku:

<script>
    function rejectPrompt(element, id_post) {
        showPreloader($(element));
        alertify.prompt('Důvod pro zamítnutí:', '',
                function (evt, value) {
                    $.getJSON(
                        {link reject!},
                            {
                                id_post: id_post,
                                reason: value,
                            }, function () {
                        hidePreloader($(element));
                        alertify.message('Příspěvek byl zamítnut');
                    });
                }, function () {
            hidePreloader($(element));
        });
    }
</script>

Takhle vypadá moje funkce presenteru která na požadavky reaguje:

public function handleReject($id_post,$reason) {
       // odmitnuti prispevku
       if ($this->isAjax()) {
           if ($this->getUser()->isLoggedIn()) {
               $this->postModel->rejectPost($id_post,$reason);
               $this->flashMessage("Odpověď zamítnuta");
               $this->redrawControl();
           }
       }
   }

A takhle vypadá snippet, který se má překreslovat:

{snippet list}
    {foreach $posts as $post}
        <article>

		(... nedůležité výpisy informací o postech ...)

			<span class="buttons">
                    <a class="btn btn-danger ajax-group" onclick="rejectPrompt(this,{$post->id_post});" data-preloader="left" alt="Zamítnout">Zamítnout</a>
                    <a class="btn btn-primary ajax ajax-group" href="{link accept! $post->id_post}" alt="Schválit">Schválit</a>
                </span>
        </article>
    {/foreach}
{/snippet}

Díky za odpověd. Sob.

EyeOfThReindeer
Člen | 4
+
0
-

Pokud JS na odesílání požadavku přepíšu aby vypadal takhle, tak to funguje. Stále by mě ale zajímalo, jakou jsem udělal chybu, že to musím takhle obcházet.

<script>
    function rejectPrompt(element, id_post) {
        showPreloader($(element));
        alertify.prompt('Důvod pro zamítnutí:', '',
                function (evt, value) {
                    $.getJSON(
                        {link reject!},
                            {
                                id_post: id_post,
                                reason: value,
                            }, function (payload) {
                        for (var id in payload.snippets) {
                            $("#" + id).html(payload.snippets[id]);
                        }
                        hidePreloader($(element));
                        alertify.message('Příspěvek byl zamítnut');
                    });
                }, function () {
            hidePreloader($(element));
        });
    }
</script>
jiri.pudil
Nette Blogger | 1029
+
0
-

$.nette.ajax() má de facto stejné api jako jQuery.ajax(settings), takže můžeš ten request poslat nějak takhle ručně:

$.nette.ajax({
	url: {link reject!},
	data: {
		id_post: id_post,
		reason: value
	},
	success: function () {
		hidePreloader($(element));
		alertify.message('Příspěvek byl zamítnut');
	},
	error: function () {
		hidePreloader($(element));
	}
});

a o snippety se postará nette.ajax.js

EyeOfThReindeer
Člen | 4
+
0
-

Ah, výborně, to funguje skvěle. Díky moc.