AJAX a snippety – neaktualizuje se mi snippet

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

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)

Ondřej Mirtes
Člen | 1536
+
0
-

Na straně PHP je vše v pořádku, problém máš v Javascriptu.

iguana007
Člen | 970
+
0
-

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
+
0
-

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
+
0
-

Když to udělám takto, tak to opět nefunguje – firebug ukáže komunikaci i response, ale snippet se neaktualizuje … takže problém bude ještě v něčem jiném asi … nějaké nápady?

Editoval iguana007 (7. 1. 2010 11:41)

bazo
Člen | 620
+
0
-

napis co presne chces dosiahnut

Ondřej Mirtes
Člen | 1536
+
0
-

Obsluhující javascript máš standardní? nezměněné jquery.nette.js ?

iguana007
Člen | 970
+
0
-

@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)

bazo
Člen | 620
+
0
-

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>
iguana007
Člen | 970
+
0
-

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á …

bazo
Člen | 620
+
0
-

tak kasli nato, nechaj to tak ako to fungovalo

iguana007
Člen | 970
+
0
-

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)

iguana007
Člen | 970
+
0
-

tak prozatím toto téma pozastavuju, vypadá to, že neplechu mi dělá javascriptové context menu … dám ho všade do řiti a dám vědět.

igi

iguana007
Člen | 970
+
0
-

vyřeseno … měl jsem nakonci v jquery.nette.js: return true misto false … kóder něco zkoušel a zapomněl to vrátit zpět :)

díky všem za pomoc
igi

Ondřej Mirtes
Člen | 1536
+
0
-

Já říkal, že to bude něčím v JS :)

iguana007
Člen | 970
+
0
-

Tak už mi jedou i ty includy a bloky … bylo to nejspíš verzí Nette, stáhnul jsem latest dev verzi a už to běhá.

igi