problém s ajaxem, prosím o radu :-)

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

Zdravím,

na nové verzi (PHP 5.3 nette 2) se snažím rozchodit ajax a nevím jak na to. Děkuji prosím za pomoc.

jquery.nette.js (je to tedy takový myšmaš prosím o odkázaní na pravý obsah souboru jquery.nette.js

<?php
/**
 * AJAX Nette Framwork plugin for jQuery
 *
 * @copyright  Copyright (c) 2009, 2010 Jan Marek
 * @copyright  Copyright (c) 2009, 2010 David Grudl
 * @license    MIT
 * @link       https://componette.org/search/?q=jquery-ajax
 */

/*
if (typeof jQuery != 'function') {
	alert('jQuery was not loaded');
}
*/

jQuery.fn.extend({
	ajaxSubmit: function (callback) {
		var form;
		var sendValues = {};

		// submit button
		if (this.is(":submit")) {
			form = this.parents("form");
			sendValues[this.attr("name")] = this.val() || "";

		// form
		} else if (this.is("form")) {
			form = this;

		// invalid element, do nothing
		} else {
			return null;
		}

		// validation
		if (form.get(0).onsubmit && !form.get(0).onsubmit()) return null;

		// get values
		var values = form.serializeArray();

		for (var i = 0; i < values.length; i++) {
			var name = values[i].name;

			// multi
			if (name in sendValues) {
				var val = sendValues[name];

				if (!(val instanceof Array)) {
					val = [val];
				}

				val.push(values[i].value);
				sendValues[name] = val;
			} else {
				sendValues[name] = values[i].value;
			}
		}

		// send ajax request
		var ajaxOptions = {
			url: form.attr("action"),
			data: sendValues,
			type: form.attr("method") || "get"
		};

		if (callback) {
			ajaxOptions.success = callback;
		}

		return jQuery.ajax(ajaxOptions);
	}
});

(function($) {

	$.nette = {
		success: function(payload)
		{
			// redirect
			if (payload.redirect) {
				window.location.href = payload.redirect;
				return;
			}

			// state
			if (payload.state) {
				$.nette.state = payload.state;
			}

			// snippets
			if (payload.snippets) {
				for (var i in payload.snippets) {
					$.nette.updateSnippet(i, payload.snippets[i]);
				}
			}
		},

		updateSnippet: function(id, html)
		{
			$('#' + id).html(html);
		},

		// create animated spinner
		createSpinner: function(id)
		{
			return this.spinner = $('<div></div>').attr('id', id ? id : 'ajax-spinner').ajaxStart(function() {
				$(this).show();

			}).ajaxStop(function() {
				$(this).hide().css({
					position: 'fixed',
					left: '50%',
					top: '50%'
				});

			}).appendTo('body').hide();
		},

		// current page state
		state: null,

		// spinner element
		spinner: null
	};


})(jQuery);



jQuery(function($) {

	$.ajaxSetup({
		success: $.nette.success,
		dataType: 'json'
	});

	$.nette.createSpinner();

	// apply AJAX unobtrusive way
	$('a.ajax').live('click', function(event) {
		event.preventDefault();
		if ($.active) return;

		$.post(this.href, $.nette.success);

		$.nette.spinner.css({
			position: 'absolute',
			left: event.pageX,
			top: event.pageY
		});
	});

        // odeslání na formulářích
        $("form").submit(function () {
                $(this).ajaxSubmit();
                return false;
        });

        // odeslání pomocí tlačítek
        $("form :submit").click(function () {
                $(this).ajaxSubmit();
                return false;
        });


});

?>

Jde mi o toto, ve startup():

<?php
$this->template->testov = "aa";
?>

Presenter:

<?php
public function handleAkce() {

             $this->template->testov = "bleeee";
             $this->invalidateControl("test");

        }
?>

Template:

<?php
<a href="{link akce!}" class="ajax">zkus</a>
{snippet test}
{$testov}
{/snippet}
?>

Jako response dostanu: {„state“:[]}

Nevíte kde je problém? Děkuji moc.

Editoval wise (6. 2. 2011 21:48)

bojovyletoun
Člen | 667
+
0
-

Nevím, kde je problém, ale já jsem si tvůj kód zkopíroval do nového presenteru a funguje to OK.
Response: {"state":[],"snippets":{"snippet--test":" bleeee"}}.
Můžeš se podívat na screencasst

Nevím kde může být chyba.
Zde je můj výtvor:

<?php

use Nette\Application\Presenter;

class TestAjaxPresenter extends Presenter{

    protected function startup(){
	parent::startup();
	$this->template->testov = "aa";
    }

    public function handleAkce(){

	$this->template->testov = "bleeee";
	$this->invalidateControl("test");
    }

}
{extends none}
<!DOCTYPE html>
<html>
    <head>
	<script type="text/javascript" src="{$basePath}/js/jquery.js"></script>
	<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
    </head>
    <body>
snipet{snippet test} {$testov}{/snippet},<a href="{link akce!}" class="ajax">zkus</a>
wise
Člen | 161
+
0
-

Zkusil jsem si to dát do novýho presenteru a funguje. To by mě zajímalo, proč to nešlo v tom předešlém. Nechápu. Každopádně děkuju moc za pomoc.

wise
Člen | 161
+
0
-

Tak už jsem na to přišel. Problém byl v tom, že jsem měl v šabloně include „nějaký soubor“ a v nějakém souboru už jenom definici html. Když jsem vše přesunul do jednoho souboru, už to fungovalo. Do vkládaného souboru se musí přidat co, aby to fungovalo?

bojovyletoun
Člen | 667
+
0
-

Moc nerozumím dotazu. Jak se problém projevil? Co bylo obsahem ‚nějakého souboru‘ a ‚definice html‘
šlo problém poznat ze zdrojáku (prázdné místo?)?

https://latte.nette.org/cs/tags
https://doc.nette.org/…n/presenters#…