Ajax neproběhne až do konce (verze 2)

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

Nevím si už rady, jsem naprostý začátečník a proto Vás prosím o radu. Mám následující kód, který však neproběhne do konce (bez Ajaxu vše funguje jak má)

@layout.phtml ...

	<script type="text/javascript" src="{$basePath}/js/jquery.js"></script>
	<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
</head>

<body>
	<div id="container">
	{snippet}
		@{include #content}
	{/snippet}
	</div>
</body>

default.phtml

@{block content}
<!--****************************************************************************************-->
	<a href="{link insert!, 1}" class="ajax">
		<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
	</a>
	<p>Náhodné číslo {$rndnum}</p>

Presenter ...

final class AuctionPresenter extends BasePresenter
{
	/**
	 * Hodnota vhozených mincí.
	 * @persistent - proměnná se přenáší mezi HTTP požadavky
	 */
	public $pokus = 1;

	public function handleInsert($num)	{
		$this->pokus = rand(1,118);
		if (!$this->isAjax()) {
			$this->redirect('this');
		}
	}

	public function actionDefault()
	{

	}

	public function renderDefault()
	{
		$this->template->rndnum= $this->pokus;
		$this->invalidateControl();
	}
}

jquery.nette.js

<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.1
 */

jQuery.extend({
	updateSnippet: function(id, html) {
		$("#" + id).html(html);
	},

	netteCallback: function(data) {
		// redirect
		if (data.redirect) {
			window.location.href = data.redirect;
		}

		// snippets
		if (data.snippets) {
			for (var i in data.snippets) {
				jQuery.updateSnippet(i, data.snippets[i]);
			}
		}
	}
});


jQuery.ajaxSetup({
	success: function (data) {
		jQuery.netteCallback(data);
	},

	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>

V JavaScriptu proběhne jen událost

<script>
// apply AJAX unobtrusive way
	$("a.ajax").live("click", function(event) {
.
.
</script>

tím celí proces končí, nevím kde je zakopán čert (proč neproběhne

<script>
jQuery.ajaxSetup({
	success: function (data) {
.
.

a vykreslení snipetu

jQuery.extend({
	updateSnippet: function(id, html) {
.
.
</script>

Může mi někdo poradit ?

despiq
Člen | 320
+
0
-

a hodi ti to nejakej error?

Saurian
Člen | 28
+
0
-

kdepak, jen ve FireBugu vidím, že proběhne pouze událost „$("a.ajax“).live(„click“, function(event) {"

(kliknutí myši), toď vše

pokud odstraním z odkazu class=„ajax“

<a href="{link insert!, 1}" class="ajax">
	<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
</a>

funguje vše normálně (tj. zobrazí se náhodné číslo).

Potřeboval bych jen tohle rozchodit a pak se můžu odrazit dál, ale jsem „zakysnutý“ na tímto problémem už druhý den (to jsem zkusil všemožné příklady Ajaxu ze stránek, nebyl problém, jen u tohoto si už nevím rady)

Ola
Člen | 385
+
0
-

Ty zavináče tam nemaj co dělat. Všude. Viz https://forum.nette.org/…agie-v-praxi

Saurian
Člen | 28
+
0
-

Se zavináči i bez nich jsem to zkoušel mockrát, výsledek stejný …

Zajímavé je, že „nové“ náhodně číslo ve výsledku JSON je (ve FireBugu / síť / JSON / snippets / snippet) je pěkně nový zápis např.

<p>Náhodné číslo 15</p>

jen se to nechce zobrazit na stránkách (přitom proběhne i animace „spinner.gif“ zcela vpořádku), jen stále vidím

<p>Náhodné číslo 1</p>
Ola
Člen | 385
+
0
-

Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}

Mikulas Dite
Člen | 756
+
0
-

Ola napsal(a):

Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}

A nezapomeň ten snippet invalidovat jménem: $this->invalidateControl('content');.

Saurian
Člen | 28
+
0
-

Já si taky myslím, že chyba by měla být právě tam (Java je zatím u mě spíše slabinou, tohle jsem jen okopíroval …)

jquery.nette.js

<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.1
 */

jQuery.extend({
	updateSnippet: function(id, html) {
		$("#" + id).html(html);
	},

	netteCallback: function(data) {
		// redirect
		if (data.redirect) {
			window.location.href = data.redirect;
		}

		// snippets
		if (data.snippets) {
			for (var i in data.snippets) {
				jQuery.updateSnippet(i, data.snippets[i]);
			}
		}
	}
});


jQuery.ajaxSetup({
	success: function (data) {
		jQuery.netteCallback(data);
	},

	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>

mám nalinkovány jen tyhle 2

<script type=„text/javascript“ src=„{$basePath}/js/jquery.js“></script>

<script type=„text/javascript“ src=„{$basePath}/js/jquery.nette.js“></script>

jquery.js by asi nebylo moudré vypisovat :)

Saurian
Člen | 28
+
0
-

Mikulas Dite napsal(a):

Ola napsal(a):

Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}

A nezapomeň ten snippet invalidovat jménem: $this->invalidateControl('content');.

Ano tohle jsem rovněž zkoušel, $this->invalidateControl('content'); v renderDefault i v signálu „handleInsert“, stále stejný výsledek.

<body>
	<div id="container">
	{snippet content}
		{include #content}
	{/snippet}
	</div>
</body>
{block content}
	<a href="{link insert!, 1}" class="ajax">
		<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
	</a>
	<p>Náhodné číslo {$rndnum}</p>
	public function handleInsert($num)	{
		$this->pokus = rand(1,118);
		if (!$this->isAjax()) {
			$this->redirect('this');
		}
//		$this->invalidateControl();
		$this->invalidateControl('content');
//		echo $this->isControlInvalid('content');
	}

	public function actionDefault()
	{

	}

	public function renderDefault()
	{
		$this->template->rndnum = $this->pokus;
//		$this->invalidateControl();
		$this->invalidateControl('content');
	}
Ola
Člen | 385
+
0
-

Mikulas Dite napsal(a):

Ola napsal(a):

Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}

A nezapomeň ten snippet invalidovat jménem: $this->invalidateControl('content');.

To není třeba, při neuvedení toho parametru se zinvalidují všechny snippety na stránce

Zkusím se ještě mrknout na ten js, jestli mi něco neprobleskne

Tak mě napadá, používáš nějakou starou verzi toho pluginu, zkus ji aktualizovat. A ještě – máš správně nalinkovaný a umístěný soubor jquery.nette.js?

Editoval Ola (11. 4. 2010 20:41)

Saurian
Člen | 28
+
0
-

tak tak, $this->invalidateControl() by mělo stačit .

verze „jquery.nette.js“ je okopírovaná z příkladu „CoffeeVendingMachineV“, což je takový modifikovaný script jako nejnovější z těchto stránek + doplňěk o …

<script>
/* Volání AJAXu u všech odkazů s třídou ajax */
$("a.ajax").live("click", function (event) {
    event.preventDefault();
    $.get(this.href);
});
</script>

, samozřejmě jsem už zkoušel různé verze, ale nic nepomáhá, výsledek je vždy stejný

scripty mám uloženy v „document_root\js\“
tedy :

document_root\js\jquery.js

document_root\js\jquery.nette.js

nalinkováno by mělo být dobře, jinak bych neviděl že proběhla událost „click“ ve FireBugu

to je zapeklitá situace, jak rád bych se pohnul už dál …

Ola
Člen | 385
+
0
-

Zkus to trochu poupravit dle tohodle:

https://componette.org/search/?…

Pokud do metody updateSnippet přidáš např. alert('Ahoj');, provede se to?

Ještě mě napadlo, zkus změnit řádek

<script>
$.get(this.href);
</script>

na

<script>
$.get(this.href, {}, function(payload) {
		if (payload.snippets) {
                        for (var i in data.snippets) {
                                $("#" + i).html(payload.snippets[i]);
                        }
                }

});
</script>

Editoval Ola (11. 4. 2010 21:37)

Saurian
Člen | 28
+
0
-

Výborný nápad s tím alertem, díky …

bohužel jak jsem říkal už víše, proběhne jen část

<script>
/* Volání AJAXu u všech odkazů s třídou ajax */
$("a.ajax").live("click", function (event) {
    event.preventDefault();
    $.get(this.href);
});
</script>

updateSnippet už neproběhne (to jsem odhalil i z toho FireBugu)

Saurian
Člen | 28
+
0
-
<script>
$(function() {
	// apply AJAX unobtrusive way
	$("a.ajax").live("click", function(event) {
		$.get(this.href, {}, function(payload) {
		alert('Ahoj');				// Alert byl přeskočen (krokováno)
                if (payload.snippets) {
                        for (var i in data.snippets) {
                                $("#" + i).html(payload.snippets[i]);
                        }
                }

		});
		// show spinner				//  Po Breakpointu to skočí sem ($.get(this.href, {}, function(payload) is false ?
		$('<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>

bohužel nepomohlo, k alertu se to nedostalo, rovnou to skočilo na „show spinner“

Ola
Člen | 385
+
0
-

V tom případě ten jQuery nezavolá událost success.

Chyba je u tebe, viz. http://jquery.jslab.net/zkousecka/#… – zde se alert zobrazí

Editoval Ola (11. 4. 2010 22:04)

Saurian
Člen | 28
+
0
-

Ola napsal(a):

V tom případě ten jQuery nezavolá událost success.

přesně tak, nezavolá, jenže co s tím ? :)

Editoval Saurian (11. 4. 2010 22:09)

Saurian
Člen | 28
+
0
-

Ola napsal(a):

Chyba je u tebe, viz. http://jquery.jslab.net/zkousecka/#… – zde se alert zobrazí

tedy klobouk dolů, pěkný nástroj, jsem rád že jsem se odvážil sem napsat na forum, člověk se docela přiučí za krátkou dobu, moc díky, opravdu pěkný nástroj …

Ola
Člen | 385
+
0
-

Zkus to celý zabalit a někam uploadnout, podíval bych se na to pořádně.

Saurian
Člen | 28
+
0
-

Ola napsal(a):

Zkus to celý zabalit a někam uploadnout, podíval bych se na to pořádně.

Perfektní

předem moc díky

Editoval Saurian (11. 4. 2010 22:39)

Ola
Člen | 385
+
0
-

Sorry, v tom kódu co sem poslal já byla chyba, změň si tam data na payload v tom for cyklu a pojede to

A pokud změnim ten kód co sem posílal zpět na $.get(this.href); tak to taky jede

// ale abych to vůbec rozjel tak sem musel smazat poslední řádek v configu

Editoval Ola (12. 4. 2010 6:59)

Saurian
Člen | 28
+
0
-

ajaj, tak to bude chyba někde u mě, že by Apache ? Zkusím najít nějaký hosting a vyzkoušet to tam.

<script>
$(function() {
	// apply AJAX unobtrusive way
	$("a.ajax").live("click", function(event) {		// u mě se script dostane sem
		$.get(this.href, {}, function(payload) {	// ...
		alert('Ahoj');					// ...
                if (payload.snippets) {				// ...
                        for (var i in payload.snippets) {	// ...
                                $("#" + i).html(payload.snippets[i]);	// .tyto řádky už neběží
                        }					// ...
                }						// ...

		});
		// show spinner
		$('<div id="ajax-spinner"></div>').css({	// a pak hned skočí sem
			position: "absolute",
			left: event.pageX + 20,
			top: event.pageY + 40

		}).ajaxStop(function() {
			$(this).remove();			// po skončení animace ? skočí sem

		}).appendTo("body");				// vykreslí se animace

		return false;					// zavolá se false
								// (neobnovení prohlížeče ?
	});
});
</script>
Saurian
Člen | 28
+
0
-

**Vyřešeno hurá** , ale řeknu Vám zapotil jsem se jak už dlouho ne ...

Nejdříve jsem velmi detailně prostudoval project „Kniha návštěv v Ajaxu“ (autor myslím Panda, kterému se zároveň omlouvám, že jsem jeho dílo rozebral doslova na šroubky :), velice pěkný materiál a nováčkům vřele doporučuji).

  • Celou dobu mě bylo divné, proč project „Kniha návštěv“ funguje a můj ne, když klíčové věci jsou stejné, („Knihu návštěv“ jsem upravil podle mého „projectu“, tedy jen odkaz s náhodným číslem).
  • Jediný rozdíl byl v tom, že „můj project“ byl v presenteru Auction, „kniha návštěv“ Homepage , maturoval jsem už i s atributy souborů atd. atd. (samozřejmě šablony, scripty … jsou shodné)
  • Kódování souborů „AuctionPresenter“ a „HomepagePresenter“ je samozřejmě UTF8, ale pak mě napadla jedna věc, podívat se na soubor v NetBeansu a ejhle
  • Na začátku souboru se zobrazil paskvil
<?php

Tohle nebylo vidět v žádném jiném prohlížeči a i délka souborů „AuctionPresenter“ a „HomepagePresenter“ byla stejná. (po opravě samozřejmě vše funguje jak má…)

Takže doporučení pro ostatní, kdo děláte v programu PHPEdit v3.4.2.930 (kde jsem vytvářel soubor „AuctionPresenter“), nedoporučuji v něm vytvářet nové soubory/adresáře, už dřív jsem pozoroval „divné“ chování v Nettu (při vytvoření nového souboru, ale nevěnoval jsem tomu tolik pozornosti, dělám v Nette Frameworku teprve týden.

Tak asi tak … :)
A ještě jednou díky Olaovi za trpělivost (s takovým problémem jsem se dlouho nesetkal .)

Editoval Saurian (13. 4. 2010 1:48)

Mortaelth
Člen | 24
+
0
-

Saurian napsal(a):

**Vyřešeno hurá** , ale řeknu Vám zapotil jsem se jak už dlouho ne ...

viz bom, melo by to jit vypnout v editoru

Saurian
Člen | 28
+
0
-

Mortaelth napsal(a):

Saurian napsal(a):

**Vyřešeno hurá** , ale řeknu Vám zapotil jsem se jak už dlouho ne ...

viz bom, melo by to jit vypnout v editoru

ano máš pravdu, „nastavení souborů / výchozí kódování pro nové soubory / UTF8 wihout Byte Order Mark“

a kvůli tomuhle se člověk tak zbytečně natrápí … , no zase vím o něco víc, tak jdeme dál do práce :) , díky …

pekelnik
Člen | 462
+
0
-

ROFL :D todle všechno kvůli BOmu?