Autor Thema: Bei Artikelnummerdirekteingabe Packungsgröße und Mindestmenge per AJAX prüfen  (Gelesen 6114 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline admin

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 545
  • Lob: 10
 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);
}

-->
 

 
 
 
 

Linkback: https://www.shoppilot.net/pf/index.php?topic=1664.0
« Letzte Änderung: September 06, 2013, 15:48:07 von admin »


xx
Eingabe Hausnummer prüfen

Begonnen von catwoman

4 Antworten
3289 Aufrufe
Letzter Beitrag Mai 25, 2021, 22:08:01
von catwoman
xx
Gutschein - Eingabe prüfen?

Begonnen von dobra

2 Antworten
6387 Aufrufe
Letzter Beitrag Mai 28, 2010, 10:42:08
von admin
xx
wie prüfen ob Bild an Server liegt ?

Begonnen von dobra

3 Antworten
7750 Aufrufe
Letzter Beitrag Oktober 17, 2011, 10:36:20
von dobra
grin
favhinzu mit ajax

Begonnen von dobra

0 Antworten
6718 Aufrufe
Letzter Beitrag November 29, 2008, 18:47:50
von dobra