IBO - Vertriebspartner in Österreich             
ShopPilot.at
zurück Home     ShopPilot.at Tutorials Scripte für diverse Aufgaben Seite empfehlen Seite drucken    teilen
Tipps - Tricks - Lösungen

Thema: Artikel mit Ajax auf den Merkzettel schreiben
Autor: dobra

Aufgabe:
Artikel auf Merkettel schreiben (__favhinzu__) soll mit Ajax realisiert werden -> kein verlassen der Detail-Seite, kein Seiten-Reload

Einbauanleitung:
Voraussetzung - ajaxsearch ist bereits installiert!!!
Achtung! lokal funktioniert es nur wenn LiveView mit mySQL arbeitet!

1) die Dateien "fav.js" und "fav.ipl" im ajax-Ordner anlegen und im WC in die "Dateien hinzufügen"-Liste schreiben
fav.js:

var re = false;
function myFavnocheinVersuch(){

 if (-1 != myinterfaceFav.search(/__xxpath__\?/)) {
      return;
  }
  
  var artnr = document.getElementById('fav_artnr').value;   // diese Daten müssen als hidden Imput übergeben werden 
  var kdnr = document.getElementById('fav_kdnr').value;
  var merch = document.getElementById('fav_merch').value;  
  var subcat = document.getElementById('fav_subcat').value;  
  
  var postdata = {
			method : 'myfavhinzu',
			id : 0,
			params : [artnr, kdnr, merch, subcat]
		};
	try {
		req = new HTTP.Request(
		{
			uri: myinterfaceFav, 
			postbody: postdata.toJSONString(),
			onSuccess: function (trans) {
				 var data; 
				try {
					data = eval('('+trans.responseText+')'); // JSON "parsen"
				} catch(e) {
					return;   
				} 
        var resultFav = data['_myFav']; //Wenn 1 dann Artikel neu eingetragen - 2 = Timestamp aktualisiert - 0 = Kunde nicht eingelogt, also nichts in DB geschrieben	  
	   
       if (resultFav == 1){
            re = false;
	   alert("Artikel wurde auf dem Merkzettel notiert");
        }
		
       if (resultFav == 2){
            re = false;
	   alert("Artikel steht bereits auf Ihrem Merkzettel");
        }
		
       else{
            re = false;
	   alert("diese Funktion steht nur eingelogten Kunden zur Verfügung");
        }			

			}
      
		}); 
	}
	catch(e)
	{
		return;
	}
  if(re == true){
    return true;
  }
  else{
    return false;
  }
}

fav.ipl:
<!--spmacro:module(fav)                     
push(@INC,'ajax');
require "JSON.pm";

print "Content-Type: text/plain;charset=ISO-8859-1\n\n";
#use utf8;
my $pCall = JSON::jsonToObj($main::input);
my %result;
$result{_call} = $pCall;

if ($pCall->{method} eq 'myfavhinzu') {
  $result{_myFav} = 1;
  
  my $fav_artid =  $pCall->{params}[0]; # Artikel 
  my $fav_kundennr = $pCall->{params}[1]; # Kundennr
  my $fav_merch = $pCall->{params}[2]; # Händler
  my $fav_iscat = $pCall->{params}[3]; # Subkat
  my $time = time();
 
	if($fav_kundennr != 'undefined') { #Kunde eingelogt
	   my $OLISTTBL = ssp::db_get_prefix() . "OLIST";
  my $sql = qq|SELECT ITEMID FROM $OLISTTBL WHERE (KUNDENNR = '$fav_kundennr' && ITEMID = '$fav_artid')|;
  my $read = ssp::readSQLData($sql, "count");
	if ($read){
		if(ssp::get_var_db("count", 0)){  #Artikel für diesen Kunden bereits vorhanden - Timestamp aktualisieren
				my $sqlupdate = qq|UPDATE $OLISTTBL SET OTIME = "$time" WHERE (ITEMID = '$fav_artid' && KUNDENNR = '$fav_kundennr')|;
				    ssp::exec_sql($sqlupdate, 1);
			                  $result{_myFav} = 2; }
			} else { #Artikel für diesen Kunden noch nicht vorhanden	- eintragen		
				my $sqlnew = qq|INSERT INTO $OLISTTBL (ITEMID, KUNDENNR, MERCHID, SCID, OTIME)
					    VALUES ('$fav_artid', '$fav_kundennr', '$fav_merch', '$fav_iscat', '$time')|;
					ssp::exec_sql($sqlnew, 1);
			                    $result{_myFav} = 1; }
		}
		else { #Kunde nicht eingelogt
			$result{_myFav} = 0; }		
}

print JSON::objToJson(\%result);
exit 0;

-->

2) eine Infoseite anlegen (Titel beliebig)
für diese Infoseite eine Vorlage eintragen auf der nichts steht außer
<!--spmacro:include(ajax/fav.ipl)-->
3) auf allen Seiten, auf denen das __favhinzu__ verwendet wird diese Codezeilen in den head-Bereich schreiben
 <script type="text/javascript" src="../ajax/fav.js"></script>   # Pfad event. anpassen
<script type="text/javascript">
 // Server-URL für die Ajax-Abfragen
 var myinterfaceFav = "__xxpath__?ajax1200006200,__xxsession__";  # hier die Seitennummer der neu angelegten Infoseite eintragen!
</script>

und den ssp-Code: (kann auch in std.all geschrieben werden)
<!--spmacro:module(ajaxvari) 
sub kdnr {
  my $x = ssp::get_var_user("kundennr");
 main::mprint($x);
}

sub artnr {
my $index = $_[0];
my $anzahl = $_[1];
	if ($index <= $anzahl) {
		my $x = ssp::get_var_article('itemid',$index);
	main::mprint($x);
	}
}

sub merch {
  my $x = ssp::get_var_merch("hid");
 main::mprint($x);
}

sub subcat {
  my $x = ssp::get_var_subcat("sid");
 main::mprint($x);
}
-->

4)  __favhinzu__    ersetzen mit
			<form method="post" action="" onSubmit="return myFavnocheinVersuch();">
				<input type="hidden" id="fav_kdnr" value="__ajaxvari::kdnr__">
				<input type="hidden" id="fav_artnr" value="__ajaxvari::artnr__">
				<input type="hidden" id="fav_merch" value="__ajaxvari::merch__">
				<input type="hidden" id="fav_subcat" value="__ajaxvari::subcat__">
				<input type="submit" class="merkzettel" value="merken">
			</form>

(dieses Formular soll natürlich nie abgesendet werden, daher ist "re" immer false)
mit class="merkzettel" kann der Button beliebig formatatiert werden, daß er z.B. so ausschaut

Es passiert folgendes:
ist der Kunde nicht eingeloggt und klickt auf den "merken" Button kommt die Meldung "diese Funktion steht nur ...."
ist der Kunde eingeloggt und der Artikel steht bereits auf der Mekliste -> Meldung "der Artikel steht bereits auf Ihrem Merkzettel" und der Timestamp wird aktualisiert
ist der Kunde eingeloggt und der Artikel steht noch nicht auf der Merkliste -> Meldung " Artikel wurde draufgeschrieben" und Artikel wird in die DB geschrieben

(man könnte das natürlich noch beliebig anpassen - z.B. Inlinemeldung statt der Alertmeldung, für nicht angemeldete Kunden ausblenden usw)


Wenn Sie fragen zum Artikel haben, bitte im Support-Forum stellen.