Bei Artikelnummerdirekteingabe Packungsgröße und Mindestmenge per AJAX prüfen

Begonnen von admin, Mai 05, 2013, 17:27:28

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

admin

 Problem: Bei der Direkteingabe bei der die Artikelnummer und die Anzahl in einem Formular angegeben wird,
ist es bislang nicht möglich die Mindestmenge (WKMIN), die Packungsgröße (WKPACK)  zu berücksichtigen.
Hier kann eine Ajaxfunktion helfen. Ich will bei dieser Gelegenheit noch mal Schritt für Schritt erklären,
wie man Ajax im Shop nutzen kann.  Voraussetzung WKPACK und WKMIN müssen beide als benutzerdefinierte
Felder angelegt sein.

1. Der Einsprungpunkt für AJAX-Calls
Hierzu legt man eine Infoseite mit dem Namen "Ajax" an.
Das Template zu dieser Seite "ajax.html" verarbeitet den Ajax-Call
und sorgt bei mehreren Ajax-Funktionen dafür, dass die richtige
Funktion aufgerufen wird. Man sollte immer dieses Muster verwenden,
auch wenn man zunächst nur eine einzige Funktion hat.



<!--spmacro:module(ajax)
push(@INC,'ajax');
require "JSON.pm";
print "Content-Type: text/plain;charset=ISO-8859-1\n\n";

my $pCall = JSON::jsonToObj($main::input);

my %methods = ('ajax_check_pc::check_pc' => 'ajax/ajax_check_pc.ipl',  # Check placecart
              'dummy::dummy' => 'ajax/dummy.ipl');   # eine andere Methode

# evtl. weitere Ajax Calls anhägen, die in Modulen definiert sind
if (defined %main::module_methods) {
%methods = (%main::methods,%module_methods);
}
       
foreach my $m (keys(%methods)) {
   my $func = $m;
   $func =~ /^.*::(\w[\w\d]*)$/;
   $func = $1;
   my $checkfunc = $m; ## Damit Funktionen auch inkl. Modulnamen angegeben werden können, zb: "method: 'ajaxsearch::getPatterns'"
   if ($pCall->{method} eq $func || $pCall->{method} eq $checkfunc) {
       main::read_templ_work($methods{$m},0);
       ssp::trace("called $func $m $methods($m)\n");
       &$m($pCall);
       exit(0);
   }
}
-->


2. Falls man den Ordner noch nicht hat, legt man im Projekt einen Ordner "ajax" an.
Dieser sollte dann auch die Datei ajax.html enthalten. Weiterhin entält er einige
Unterordner mit Perl-Modulen und das Json.pm uund json2.js. Das braucht uns aber nicht näher
zu interessieren. Wir können diese Ordner einfach von einem der Demoshops
kopieren.
Für unsere Anwendung sind zwei Dateien in diesem Ordner wichtig.
Einmal eine js-Datei und eine ipl-Datei jeweils mit dem Namen unserer Anwendung.
Also hier ajax_check_pc.js und ajax_check_pc.ipl.

3. ajax_check_pc.js stellt die Funktion (check_pc) zur Verfügung, die beim Absenden des Formulars prüfen soll
ob alles ok ist. Wenn nicht soll ein Hinweis ausgegeben werden und das Formular wird nicht abgeschickt.
Das Formular befindet sich üblicherweise im Warenkorb (p_cart.html)
Der Aufruf der Funktion wird in den onsubmit Callback des Formulars eingebaut.


 <form action="__xxpath__?placecart__xxpgid__,__xxsession__" method="post"  id="id_direkteingabe" onsubmit="return check_pc(this)">
   <input type="hidden" name="directItem_required" value="ungültige Artikelnummer" />
   ArtikelNr <input name="directItem" class="input_text">
   Anzahl <input name="directCount" class="input_text" size="4">
   <input type="submit" class="input_button" value="Hinzuf&uuml;gen" name="B1" />
 </form>
 <div id="pc_error_message" class="error"></div>


Da wir jetzt schon beim Warenkorb sind, können wir auch einbauen, dass die notwendigen Js-Dateien
angezogen werden und dass die feste Seitennummer unserer Ajax-Seite bekannt gemacht wird (myinterface).
Achtung: Wenn Sie die Seite Ajax neu anlegen, erhalten Sie vermutlich eine andere Seitennummer.
Im Head-Bereich schreiben wir also:

<!-- für ajax_check_pc  -->
<script type="text/javascript">
// Server-URL für die Ajax-Abfragen
 var myinterface = "__xxpath__?ajax1200000520,__xxsession__";
</script>
<script type="text/javascript" src="../ajax/json2.js"></script>
<script type="text/javascript" src="../ajax/http/Request.js"></script>
<script type="text/javascript"  src="../ajax/ajax_check_pc.js"></script>
<!-- Ende ajax_check_pc -->

4. Hier nun der Code von ajax_check_pc.js. Die Funktion wird beim Absenden
des Formulars aufgerufen und übergibt die Artikelnummer an die Ipl-Funktion.
Diese liefert gültig oder ungültig zurück. Und bei gültiger Artikelnummer
die Werte für WKPACK und WKMIN. Diese werden dann hier mit der
Anzahl, die der Kunde eingegeben hat, überprüft. Bei einem Fehler
wird ein entsprechende Meldung an "#pc_error_message" ausgegeben.
Ist alles ok, wird das Formular mit submit() abgeschickt.


/* Check place Cart */
function check_pc(form){

 if (-1 != myinterface.search(/__xxpath__\?/)) {
     return;
 }
 
 var itid  = form.directItem.value;  
 var count = form.directCount.value;
 
 var postdata = {
method : 'check_pc',
id : 0,
params : [itid, count]
};
try {
req = new HTTP.Request(
{
uri: myinterface,
postbody: JSON.stringify(postdata),  //für JSON2 geändert
onSuccess: function (trans) {
var data;
try {
data = eval('('+trans.responseText+')'); // JSON "parsen"
} catch(e) {
return;  
}
       var str;
       
       if (data['valid'] == 0) {
         str = "Fehler: ungültige Artikelnummer";
       } else {
         if ((data['wkmin'] > 1) && (count < data['wkmin'])) {
           str = "Fehler: Die Mindestmenge für diesen Artikel ist: " + data['wkmin'];
         } else {
           if ((data['wkpack'] > 1) &&(count%data['wkpack'] !=0)) {
             str = "Fehler: Bitte Packungsgrösse " + data['wkpack'] + " beachten.\n Nur Vielfache eingeben!";
           } else {
               form.submit();
           }
         }
       }
       document.getElementById("pc_error_message").innerHTML = str;
}
}
);
}
catch(e)
{
return false;
}
 
 return false;
     
}


5. Als letztes benötigen wir noch die ipl-Funktioen, welche durch Zugriff auf die Datenbank die
aktuellen Werte für diese Artikelnummer holt oder eine falsche Artikelnummer feststellt.


<!--spmacro:module(ajax_check_pc)                    
             
sub check_pc {
 my $pCall= $_[0];

 my $itid = $pCall->{params}[0]; # Artikelnr
 my $count = $pCall->{params}[1]; # Anzahl (eigentlich hier nicht benötigt)
 
 #use Data::Dumper;
 #ssp::trace(Dumper($pCall));
 

my $ITEM = ssp::db_get_prefix() . "ITEM";

 
 my $query;
     $query = qq|SELECT ITEMID, WKMIN, WKPACK FROM $ITEM WHERE ITEMID = '$itid'|;

 #ssp::trace("query:$query\n");
 
  my $count = ssp::readSQLData($query, "ITEMID","WKMIN","WKPACK");
  my $wkpack;
  my $wkmin;
  my $valid = 0;
  if ($count > 0) {
    $wkpack = ssp::get_var_db("WKPACK",0);
    $wkmin  = ssp::get_var_db("WKMIN",0);
    $valid = 1;
  }
 
  $result{valid} = $valid;  # Artikelnummer gültig
  $result{wkpack} = int($wkpack);  # Packungsggröße
  $result{wkmin} = int($wkmin);    # Mindestanzahl

  print JSON::objToJson(\%result);
}

-->