Zielsetzung und Problembeschreibung

Zunächst einmal die Beschreibung, was passiert soll: Wenn der Nutzer auf den Link „Warenkorb löschen" im Mini-Cart-Modul klickt, dann wird die aktuelle Seite auf der sich der User gerade befindet verlassen um die Warenkorb-Löschen-Seiten anzuzeigen. Nach Bestätigung der Löschabsicht erfolgt das Leeren des Warenkorbes und der User soll dann wieder zurück auf seine ursprüngliche Seite geleitet werden, von wo aus der im Modul den Warenkorb-Löschen-Link betätigt hatte.

Prinzipiell könnte man die Löschaktion auch über eine Ajax-Funktion ausführen und die Bestätigungsabfrage und ggf. Erfolgsmeldung in einem modalen Dialog anzeigen, dann könnte man sich die Rücksprungaktivitäten sparen. In unserem Fall soll dies abe über eine separate Seiten erfolgen. Das wiederum ist dann aber nicht so einfach, weil der Server die Information verarbeiten muss, von wo der User ursprünglich kam.

Hierbei gibt es weiterhin eine Besonderheit zu berücksichtigen. Solange wir komplette Seiten aufrufen, ist dem Server auch immer über die REQUEST_URI die Ursprungsadresse bekannt, so dass auch bei Anzeige des Warenkorb-Moduls die Rücklinkinfos abgefragt und weitergegeben werden können. Anders wenn der Warenkorb per Ajax aktualisiert wird, z.B. wenn ein Produkt zum Warenkorb per Ajax-Request hinzugefügt wird.



In diesem Fall, kennt das Modul-Script nicht mehr den Seiten-URL sondern den vom Ajax-Request. Für den späteren Rücksprung brauchen wir aber den der Seite.

 

Für die Löschaktion und den Rücksprung findet ein Zusammenspiel zw. dem Warenkorb-Modulscript (shop.basket-short.php) und dem Löschscript (shop.cart-reset.php) in der Art statt, dass neben den normalen Shop-URL-Parametern weiter der Rücksprungadresse übergeben werden. Nun können die Parameter wie z.B. option und page etc. natürlich nicht einfach noch mal gleichlautend angehängt werden. Das würde zum Konflikt führen. Deshalb werden die Rücksprung-Adress-Parameter umbenannt übergeben. Jedem Parameterbezeichner wird der String „return_" vorangestellt. Im shop.cart-reset.php-Script werden diese Parameter wieder zurückbenannt und daraus dann die korrekte Rücksprungseiten-Adresse aufgebaut.

Ein weiteres Problem ist zu berücksichtigen, nämlich dass wir dabei auch die SEF-Unterstützung sicherstellen müssen. Diese SEF-Adressen haben keine sichtbaren Parameter, weshalb eine geeignete Behandlung dieser Adressen stattfinden muss.

 

Umsetzung im Detail

Prinziell ist die Umsetzung in VM 1.x schon vorgesehen, funktionierte aber nicht zuverlässig. Die notw. Änderungen sind aber gering und betreffen folgende zwei Scripte:

1. theme.js

Mit diesem Script, konkret der Funktion updateMiniCarts() stellen wir sicher, dass beim Aktualisieren des MiniCart-Moduls durch den Ajax-Aufruf zusätzlich ein POST-Parameter return_url übergeben wird. Dieser Return-Url enhält die Adresse von der Seiten auf der sicher der User aktuell befindet. Folgende Zeile wird eingefügt:

 

var postoptions = { 
		only_page:1,
		page:"shop.basket_short",
		option:"com_virtuemart",
		return_url:window.location.href.toString()
	}
	var option = { method: 'post', onComplete: callbackCart, data: postoptions }
	new Ajax( live_site + '/index2.php', option).request();

 

Wie hier zu sehen holen wir und die Adresse über die Funktion window.location.href als String. Alle Postparameter werden an nachfolgendes Script übergeben:

 

2. shop.basket-short.php

Die Einfügungen hier sind etwas umfangreicher und erfüllen folgende Aufgaben:
Zunächst müssen wir berücksichtigen, dass unsere Return-Adresse unterschiedlichen Ursprungs sein kann, entweder bei einem kompletten Seitenaufruf ist es schlicht und ergreifend der Server-Request-Uri oder im Fall eines Ajax-Aufrufes kommen diese Daten aus den POST-Parametern. Damit befüllen wir die temp. Variable $return_url. Diese von Domain und vorangestelltem Slash befreit.
Sollten wir ein SEF-URL erkennen (alles ohne index.php?) dann müssen wir für diesen SEF-URL die Real-Adresse holen, dass erfolgt durch einen DB-Zugriff auf die jos_redirection.
Aus dieser Adresse löschen wir dann das index.php? und splitten die verbliebenen Parameter auf, damit wir vor jeden Parameterbezeichner return_ davor bauen können. Dann wirder der URL-String so modifiziert wieder zus.gebaut.

 

// Display clear cart
$delete_cart = '';
	$return_url = (isset($_POST['return_url'])) ? $_POST['return_url'] : $_SERVER['REQUEST_URI']; // Hinweis: Request_URI liefert immer ein Non-SEF-Uri 
	$return_url = str_replace($mm_action_url,'',$return_url);
	$return_url = trim($return_url,DS);
	if (strpos($return_url,"index.php?") === false) { // wenn ein SEF-Url, dann erst realUrl holen
		$dbRedir = new ps_DB();
		$dbRedir->query("SELECT `newurl` FROM `jos_redirection` WHERE `oldurl` LIKE '$return_url'");
		$return_url = $dbRedir->loadResult();
	}
	$return_url = str_replace('index.php?','',$return_url);
	$urlParts = explode("&", $return_url);
	foreach($urlParts as $Part) $returnURL .= "&return_".$Part;
	$delete_cart = "<a href=\"".str_replace("index2.php", "index.php", $_SERVER['SCRIPT_NAME'])
		. "?page=shop.cart_reset&amp;option=com_virtuemart".$returnURL. "\" title=\""
		. $VM_LANG->_('VM_EMPTY_YOUR_CART_TIP') ." \">
					<img src=\"". $mosConfig_live_site ."/images/cancel_f2.png\" width=\"12\" border=\"0\" style=\"margin-right:4px; vertical-align: middle;\" />"
		. $VM_LANG->_('VM_EMPTY_YOUR_CART_TIP')."</a>"; 
}