Ajax Request Anzahl Artikel im Warenkorb, wie Template neu laden?

Hallo liebe Oxid Gemeinde,

ich habe im Warenkorb (inputfeld Menge) ein onkeyup Event eingebaut, welches die eingegebene Menge via Ajax zum Server sendet. Dazu habe ich eine neue View erstellt:


<?php

class ajaxbasket extends basket {
    protected $_sThisTemplate = 'page/checkout/ajaxbasket.tpl';
    public function render()
    {
        parent::render();
        return $this->_sThisTemplate;
    }
}
?>

Das Template ajaxbasket.tpl ist quasi eine Kopie der basket.tpl ohne Header und Footer. Laut Firebug geht der Request sauber an den Server raus und als Antwort erhalte ich das Template mit den neuen Werten, also neuer Artikelgesamtpreis und neuer Gesamtpreis des Warenkorbes.

Mein Problem ist jetzt dass das sichtbare Template nicht geändert wird, man sieht also immer nur das normale Template ohne einen “Reload”. ich bin davon ausgegangen, dass durch parent::render(); das neue Template geladen wird?

Kann mir bitte jemand helfen :slight_smile:

Vielen dank, Thomas

Was genau willst du machen/machst du da?
Das Ergebnis des Ajax calls musst du doch noch per JS in den DOM einbringen. Nur durch den call passiert das nicht.
Grüße

Rafael

Hallo,
vielen Dank für die Antwort. Wenn ich das richtig verstehe muss ich die Antwort des Servers so in die Seite einfügen:



	// Request auswerten
	function interpretRequest_[{$smarty.foreach.test_Contents.iteration}]() {
		switch (request.readyState) {
			// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
			case 4:
				if (request.status != 200) {
					alert("Der Request wurde abgeschlossen, ist aber nicht OK
Fehler:"+request.status);
				} else {			
					// Antwort des Servers -> als XML-Dokument
					var xmlDoc	= request.responseXML;
					// Namen in die Felder schreiben
					document.getElementById("new_basket").innerHTML = request.responseXML;
				}
				break;
			default:
				break;
		}
	}


Es soll genau der Inhalt des Warenkorbes, und nur der, nach Ändern der Menge eines Artikels neu geladen werden.

Das Ajax Request ist auf jeder Artikelzeile (im Warenkorb) hinterlegt (mit einer fortlaufenden Nummer (Zeile 1 startet Ajax Request 1 und so weiter) versehen. Leider erreiche ich die Ausgabe der Antwort per Javascript nicht. Die Response - Funktion wird auch auf jeder Seite aufgerufen, eventuell liegt da ja das Problem.

Mit Ajax beschäftige ich mich seit letzter Woche. Wenn der Server mir die richtige Antwort sendet (laut Firebug) muss die doch auch sichtbar gemacht werden können.

Irgendwie komm ich nicht weiter.

Viele Grüße, Thomas

Sieht so als als würdest du dich etwas weiter mit Ajax beschäftigen müssen bis du das Konzept dahinter verstehst :wink: (soll nicht so Böse klingen)

Benutzt du das azure Template?
wenn ja dann ist jQuery bei dir geladen.

Schau dir dazu mal
http://api.jquery.com/jQuery.post/
oder http://api.jquery.com/jQuery.ajax/

Wenn du dann eh schon dabei bist würde ich mich dann auch gleich weiter mit JSON beschäftigen vermindert den Overhead an Daten die gesendet werden müssen schließlich brauchst du ja nur den neuen Preis.

Grüße

Rafael

Ja, vielen Dank für deine Antwort, ich hatte gehofft, das es aufgrund der ja schon vorhandenen Antwort in Form des Templateauzugs nicht mehr viel ist, was da noch zu ändern ist. Aber wie du schon richtig festgestellt hast muss ich wohl noch einiges in dem Bereich lernen.

Also Danke für die 2 Seiten, die schau ich mir im Anschluss mal an.

Ich nutze übrigens das basic Template.

Viele Grüße und Danke, Thomas

Dann: jQuery einbinden kann nie schaden :wink: erleichtert das arbeiten mit JS ungemein.

Ne Frage, in deinem Quellcode wo kommt das Request her ? das benutzt du so selbst verständlich in deiner Funktion das musst du vorher ja irgendwie definiert haben.
was steht denn drin ?
mal

console.log(request); 

mit ausführen lassen und in Firebug nachschauen, ich könnte vermuten dass es leer ist. aber ohne den kompletten Code zu kennen kann ich nur im dunkeln tippen.

Grüße

Rafaek

Wow, vielen Dank für deinen Support :slight_smile:

also das ist meine Request Funktion:



	// Request senden
	function setRequest_[{$smarty.foreach.test_Contents.iteration}](id) {
		// Request erzeugen
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest(); // Mozilla, Safari, Opera
		} else if (window.ActiveXObject) {
			try {
				request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
			} catch (e) {
				try {
					request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
				} catch (e) {}
			}
		}

		// überprüfen, ob Request erzeugt wurde
		if (!request) {
			alert("Kann keine XMLHTTP-Instanz erzeugen");
			return false;
		} else {
			var value = document.getElementById('source_[{$smarty.foreach.test_Contents.iteration}]').value;
			var url = "index.php/?cl=ajaxbasket&shp=1&fnc=changebasket&aid=[{ $basketproduct->oxarticles__oxid->value }]&bindex=0&am="+value";
			// Name auslesen
			// Request öffnen
			request.open('post', url, true);
			request.send("index.php/?cl=ajaxbasket&shp=1&fnc=changebasket&aid=[{ $basketproduct->oxarticles__oxid->value }]&bindex=0&am="+value);
			// Requestheader senden
			request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			// Request senden
			// Request auswerten
			request.onreadystatechange = interpretRequest_[{$smarty.foreach.test_Contents.iteration}];
		}
	}
	// Request auswerten
	function interpretRequest_[{$smarty.foreach.test_Contents.iteration}]() {
		switch (request.readyState) {
			// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
			case 4:
				if (request.status != 200) {
					alert("Der Request wurde abgeschlossen, ist aber nicht OK
Fehler:"+request.status);
				} else {			
					// Antwort des Servers -> als XML-Dokument
					var xmlDoc	= request.responseXML;
					// Namen in die Felder schreiben
					document.getElementById("new_basket").innerHTML = request.response;
				}
				break;
			default:
				break;
		}
	}
  //-->
  </script>

jquery ist aufgrund anderer bereits eingebauter Funktionen bereits im Shop integriert.

Der Request enthält folgende Daten, zu finden im Anhang als Gif Bild

Thomas

Da geht es mir gerade nicht drum … dass der request kommt bezweifle ich nicht nur. wie es in dem Codeschnipsel oben aussieht definierst du request innerhalb der Funktion setRequest…
und versuchst es dann in interpretRequest aufzurufen.

Wenn du request nicht irgendwo außerhalb der beiden Funktionen schon mal definiert hast dann ist request nur im scope von setRequest erreichbar.
Und zum JS Debuggen mach mal die Konsole und Script im Firebug an! schreib den Codeschnipsel den ich dir geschrieben hab in interpretRequest gleich am Anfang und guck im Konsolenfenster von Firebug was passiert.

Grüße

Rafael

es geht :smiley:

Vielen Dank für deine Hife, also es lag daran, das die Werte doppelt abgeschickt wurden und auch erst der Post und dann der Header, alles etwas kaputtgebastelt.

Nach dem richten geht es jetzt und lässt mir noch genug Potential zum Optimieren :wink:

Also vielen vielen Dank für deine Hilfe.

Schonmal ein feines Wochenende wünscht der Thomas

Wieso verwendest Du denn nicht die JQuery AJAX Funktionalitäten, das würde doch so einiges vereinfachen?

Hier ist der Vollständigkeit halber nochmal die Ausgabe der Konsole als Bild im Anhang

Wenn ich das Problem lösen würde und jQuery eingebunden ist:



$(".ajaxcall_button").click(function(){
$.post("/index.php", {"cl"="ajaxbasket", weitere parameter}, function(data){
$("#new_basket").html(data); 
});
});

etwas kürzer als deins macht aber im Grunde das selbe. evtl noch Fehlerabfrage falls der Server nicht antwortet wie du es schon gemacht hattest.

Grüße

Rafael