favhinzu mit ajax

Begonnen von dobra, November 29, 2008, 18:47:50

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

dobra

Hallo,

Die Idee:  ich habe (um das bis jetzt gelernte mal zu üben ;)) __favhinzu__ mit Ajax realisiert
= für Detailseiten! -> kein verlassen der Seite, kein Reload
es funktioniert alles, wie es soll  ;D ;D ;D  (viel freu)
(getestet im Woll-Insel Shop und im Demo-Carshop)

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)

P.S.: @support - wenn OK eventuell in SSP Bibliothek verschieben?
mfG
dobra