AJAX a snippety – neaktualizuje se mi snippet
- iguana007
- Člen | 970
Ahoj,
s Nette vytvářím svůj první projekt a nevím si rady s Ajaxem … jak
bych chtěl aby to fungovalo:
Po kliknutí na odkaz na hlavní stránce (odkaz v treeView) chci, aby se mi
načetl response do DIVu #topPane. Po kliku za ma volat presenter Article a akce
listArticles.
Mám následující strukturu:
@layout.phtml
<div id="TopPane">
@{include #content}
</div>
Article/listArticles.phtml
@{block #content}
{snippet topPane}
{$listArticles}
{/snippet}
ArticlePresenter.php
<?php
class Admin_ArticlePresenter extends BasePresenter
{
public function actionListArticles($id)
{
$this->template->listArticles = "LIST ARTICLES - ". $id;
$this->invalidateControl('topPane');
}
}
Po kliku na odkaz mi firebug ukaze, ze se zavolala URL:
...../document_root/admin.article/list-articles/1
s response – klasicka:
{"state":[],"snippets":{"snippet--topPane":" LIST ARTICLES - 1\r\n"}}
… ale na strance se mi nic nezaktualizuje… obzvlaste v DIVu #topPane
Thready ve foru od Pandy apod. jsem si prochazel, ale porad to asi nechapu…
Nějaký nápad co dělám špatně?
Díky moc za každou radu.
igi
Editoval iguana007 (7. 1. 2010 9:19)
- iguana007
- Člen | 970
Tak už vyřeseno, funguje to, díky bazo (jabber chat) :)
V šabloně mi chyběl DIV s id #snippet–topPane – to byl cely problem … mozna bych to dopsal do dokumentace, protoze jsem na toto nikde predtim nenarazil…
takze ted muj kod vypada takto:
@layout.phtml
<div id="TopPane">
<div id="snippet--topPane">
@{include #content}
</div>
</div>
Article/listArticles.phtml
@{block #content}
{snippet topPane}
{$listArticles}
{/snippet}
{/block}
Mám to správně?
Díky
igi
Editoval iguana007 (7. 1. 2010 11:06)
- Ondřej Mirtes
- Člen | 1536
No ne, takhle by se to fakt řešit nemělo – ten
<div id="snippet--topPane">
ti vygeneruje právě to
{snippet topPane}
.
Zkus si opravit šablonu na:
@{block #content}
{snippet topPane}
{$listArticles}
{/snippet}
@{/block}
(přidání zavináče před {/block}
)
A odstraň ten obalující div z layoutu.
- iguana007
- Člen | 970
@bazo: no Ondřej píše, že to co si mi poradil, není správné řešení. Tj. přidání toho divu s #snippet–topPane, tak řešíme, jak to rozchodit, aníž bych to tam musel přidávat.
@Ondřej:
vypadá takto:
<script>
/**
* AJAX Nette Framwork plugin for jQuery
*
* @copyright Copyright (c) 2009 Jan Marek
* @license MIT
* @link https://componette.org/search/?q=jquery-ajax
* @version 0.2
*/
jQuery.extend({
nette: {
updateSnippet: function (id, html) {
$("#" + id).html(html);
},
success: function (payload) {
// redirect
if (payload.redirect) {
window.location.href = payload.redirect;
return;
}
// snippets
if (payload.snippets) {
for (var i in payload.snippets) {
jQuery.nette.updateSnippet(i, payload.snippets[i]);
}
}
}
}
});
jQuery.ajaxSetup({
success: jQuery.nette.success,
dataType: "json"
});
$(function() {
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) {
$.get(this.href);
// show spinner
$('<div id="ajax-spinner"></div>').css({
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
}).ajaxStop(function() {
$(this).remove();
}).appendTo("body");
return false;
});
});
</script>
Editoval iguana007 (7. 1. 2010 12:43)
- iguana007
- Člen | 970
bazo napsal(a):
iguana007 napsal(a):
@bazo: no Ondřej píše, že to co si mi poradil, není správné řešení.
tak aby bol spokojny skus zmenit layout, mozno mu to ulahodi :)
<div id="TopPane"> {snippet toPane} @{include #content} </div>
Když to tam dám takhle, tak mi firebug nahlasí error:
uncaught exception: [Exception… „Could not convert JavaScript argument arg
0“ nsresult: „0×80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)“ location: „JS
frame :: http://localhost/…js/jquery.js :: anonymous :: line 12“
data: no]
A stránka se mi načte celá rozsypaná …
- iguana007
- Člen | 970
EDIT: trošku jsem tuto zprávu upravil, protože se mi problém trochu změnil… ;)
rád bych v tomto vlákně pokračoval, protože problém se snippety mi pokračuje dál… :(((
Nyní se mi po kliknutí na první odkaz zaktualizuje první snippet, což je ok. Ale jakmile kliknu na druhý odkaz uvnitř snippetu, tak s mi neaktualizuje druhý snippet. Vysvětlím:
Layout mám rozdělený na 3 části: levá strana a vpravo mám horní a
dolní. Má se to chovat takto:
Vlevo mám seznam kategorií článků, když na jednu z nich kliknu, tak se mi
má zavolat Article:listArticles a v pravém horním snippetu se má zobrazit
seznam článků – toto funguje. V tomto listingu článku zobrazuji
u každé položky odkaz na Article:editArticle. Jakmile na něj kliknu, tak se
mi má v pravé spodní části zobrazit formulář na editaci článků –
místo toho se mi načte jen template editArticle.phtml přes celou stránku,
místo toho aby se vložila do snippetu.
Nyní zdrojáky:
@layout.phtml
<div id="TopPane">
<div id="TopPane-in"><div id="TopPane-in2">
<div id="snippet--topPane">
@{include #contentTop}
</div>
</div></div>
</div>
<div id="BottomPane">
<div id="BottomPane-in"><div id="BottomPane-in2">
<div id="snippet--bottomPane">
@{include #contentBottom}
</div>
</div></div>
</div>
@ArticlePresenter
<?php
class Admin_ArticlePresenter extends BasePresenter
{
public function actionListArticles($id)
{
$articleModel = new ArticleModel;
$this->template->listArticles = $articleModel->getArticlesById($id);
$this->invalidateControl('topPane');
}
public function actionEditArticles($id)
{
//zatim zobrazim to stejne jako nahore nez rozchodim ten AJAX
$articleModel = new ArticleModel;
$this->template->listArticles = $articleModel->getArticlesById($id);
$this->invalidateControl('bottomPane');
}
}
Article/listArticles.phtml – odkaz v listingu článků, který má odkázat na editaci
@{block #contentTop}
{snippet topPane}
....
listing článků
...
<li id="open"><a href="{plink Article:editArticles}{$article->unique_id}" class="ajax">Open</a></li>
...
listing článků
...
{/snippet}
@{/block}
Article/editArticle.phtml
@{block #contentBottom}
{snippet bottomPane}
....
obsah template
...
{/snippet}
@{/block}
Editoval iguana007 (8. 1. 2010 10:43)