Manuální překreslení snippetu
- EyeOfThReindeer
- Člen | 4
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
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
$.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