Menge im Warenkorb ändern

Um die Menge eines im Warenkorb befindlichen Produktes zu ändern, muss normalerweise die Produktdetailansicht (ws_product.htm) aufgerufen werden. Dort kann der Käufer die gewünschte Änderung vornehmen und die Produktmenge aktualisieren.

Um diesen Prozess abzukürzen, kann die Änderung der Menge auch direkt auf der Warenkorbseite (ws_basket.htm) angeboten werden:

Integration


Achtung:

Jede Änderung der Produktmenge mittels der Plus- und Minussymbole ist ein AJAX-Call, wodurch die verbrauchten Leistungseinheiten (LE) steigen.

Schritt 1: Freischaltung/Aktivierung

Es ist keine Freischaltung oder Aktivierung seitens WEBSALE nötig.

Schritt 2: Menge-ändern-Funktion (JavaScripte) auf der Warenkorbseite (ws_basket.htm)
Ergänzen Sie auf der Warenkorbseite (ws_basket.htm) folgenden Code:
 

{WS-TplComment}
	<!-- Change quantity in Cart -->
	<!-- Falls noch nicht global eingebunden, wird das folgende Modul benötigt -->
	<!-- Die Modul-Datei kann auch über das WEBSALE PageSpeed-Tool eingebunden werden -->
{/WS-TplComment}
	<script src="/$WS/ws_sysdata/js/ws-module-ajaxgeneric-1.8.5.js"></script>
	

{WS-TplComment}
	<!-- Change quantity in Cart -->
	<!-- Für die Mengen-Änderung kann ein Skript-Datei eingebunden werden -->
	<!-- Das Script kann auch ausgelagert werden in eine externe Datei, z.B. ws-module-basket-change-quantity.js-->
{/WS-TplComment}	
<script>
  // Versteckte Felder per Ajax Laden
  $(document).on('mousedown','.basket--quantity--change button,.basket--quantity--change input',function(){
    var $quantityupdown = $(this).data('quantity');
    var $basketprnumber = $(this).closest('.basket--quantity--change').data('basketprnumber');
    var $basketchangelink = $(this).closest('.basket--quantity--change').data('basketchangelink');

    if(!$('#productform--basket--quantity--'+$basketprnumber).length > 0 ){
      ws_AJAXloadTemplate($basketchangelink+'&tpl=incl_basket_quantity_change.htm&otpproductnumber='+$basketprnumber, '~WS-Charset~', ws_AJAXBasketAjaxChangeQuantityStart, ws_AJAXBasketAjaxChangeQuantityError, 'ws_AJAXBasketAjaxChangeQuantityResponseSuccess()', 'ws_AJAXBasketAjaxChangeQuantityResponseError()');
    }
  });

  // Funktion um die Inputs zu spiegeln und den Change auszulösen
  function mirrorbasketinputs() {
    $('.basket--quantity--change').each(function(){
      var $value = $(this).find('input[data-quantity="input"]').val();
      var $basketprnumber = $(this).data('basketprnumber');
      var $basketprnumberinput = $('#productform--basket--quantity--'+$basketprnumber).find('.ajax-quantity-hidden-change');
      if($basketprnumberinput.length > 0 ){
        if($basketprnumberinput.val() !== $value){
          $basketprnumberinput.val($value);
          ws_AJAXsendForm('productform--basket--quantity--'+$basketprnumber, '~WS-Charset~', ws_AJAXBasketChangeQuantityStart, ws_AJAXBasketChangeQuantityError, 'ws_AJAXBasketChangeQuantityResponseSuccess()', 'ws_AJAXBasketChangeQuantityResponseError()');
        }
      }

    });
  }

  // Ändern der Menge (-)
  $(document).on('click','.basket--quantity--change button[data-quantity="down"]',function(){
      var $this = $(this).siblings('input[data-quantity="input"]');
      var inputValue = parseInt($this.val());
      if(inputValue > "1"){
        $this.val(inputValue-1);
        mirrorbasketinputs();
      }
  });

  // Ändern der Menge (+)
  $(document).on('click','.basket--quantity--change button[data-quantity="up"]',function(){
    var $input = $(this).siblings('input[data-quantity="input"]');
    var inputValue = parseInt($input.val());
    $input.val(inputValue+1);
    mirrorbasketinputs();
  });

  // Ändern der Menge (Input)
  $(document).on('focusout','input[data-quantity="input"]',function(){
    mirrorbasketinputs();
  });

  //Diese Funktion wird aufgerufen bevor die AJAX-Anfrage abgesetzt wird.
  //Mit dieser Funktion ist zum Beispiel eine Ladeanzeige realisierbar
  function ws_AJAXBasketChangeQuantityStart()
  {
    $('#ws--basket').addClass('ajaxreload');
  }

  //Diese Funktion wird aufgerufen wenn die AJAX-Anfrage erfolgreich geladen werden konnte
  //Mit dieser Funktion ist die Erfolgsmeldung realisierbar
  function ws_AJAXBasketChangeQuantityResponseSuccess()
  {
    $('#ws--basket').removeClass('ajaxreload');
    $('#basket--quantity--change--error').empty();
  }

  //Diese Funktion wird aufgerufen wenn die AJAX-Anfrage NICHT geladen werden konnte
  //Mit dieser Funktion laesst sich die von WEBSALE V8s erzeugte Fehlermeldung ausgeben
  function ws_AJAXBasketChangeQuantityResponseError()
  {
    $('#ws--basket').removeClass('ajaxreload');

    // Bei einem Fehler wird das Input Feld geleert, mit diesem Script wird es wieder mit dem richtigen Wert gefüllt.
    // Bei einem Fehler wird das Input Feld mit dem Zuletzt gesetzten Wert befüllt
    $('.basket--quantity--change').each(function(){
      var $basketprnumber = $(this).data('basketprnumber');
      var $currentval = $(this).find('[basket-pr-currentval]').attr('basket-pr-currentval');
      var $thisinput = $(this).find('input[data-quantity="input"]');

      $($thisinput).val($currentval);
      $('#productform--basket--quantity--'+$basketprnumber+' .ajax-quantity-hidden-change').val($currentval);

    })
  }

  //Diese Funktion wird aufgerufen wenn die AJAX-Kommunikation fehlschlug
  //Mit dieser Funktion laesst sich ein allgemeiner Kommunikationsfehler (z.B. wenn die Internetverbindung unterbrochen wurde) anzeigen
  function ws_AJAXBasketChangeQuantityError() {
    $('#ws--basket').removeClass('ajaxreload');
    console.log('Basket Quantity Change Error');
  }

  // Funktionen für Hidden Inputs
  function ws_AJAXBasketAjaxChangeQuantityStart(){}
  function ws_AJAXBasketAjaxChangeQuantityResponseSuccess() {
    mirrorbasketinputs();
  }
  function ws_AJAXBasketAjaxChangeQuantityResponseError(){}
  function ws_AJAXBasketAjaxChangeQuantityError(){}
</script>	
	

	
	

Schritt 3: Anzeigebereiche auf der Warenkorbseite (ws_basket.htm)

Fügen Sie auf der Warenkorbseite (ws_basket.htm) folgende Anzeigebereiche innerhalb des FORM-Elements hinzu:

<form action="~FORM-Basket~">
   ...
   <!-- Anzeigebereich für die Fehlermeldung (Geladen aus der ws_basket_ajax_error.htm) -->
   <div id="basket--quantity--change--error"></div>
 
   <!-- Anzeigebereich für den Warenkorb (Include aus der incl_fast_includes.htm) -->
   <div id="ws--basket">
      ~WS-Fast_Include(Incl-Basket)~
   </div>
   ...
</form>

Fügen Sie auf der Warenkorbseite (ws_basket.htm) folgenden Anzeigebereich außerhalb des FORM-Elements hinzu:

<div style="display:none">
   <!-- Anzeigebereich für Änderung der Menge im Warenkorb ## AJAX-Tag ist im Template "incl_basket_quantity_change.htm" -->
   {@BASKET-PR-Data}
      <div id="quantity--change--ajax--~BASKET-PR-Number~"></div>
   {/@BASKET-PR-Data}
</div>

Schritt 4: Fast-Include-Template ergänzen

Ergänzen Sie auf dem Fast-Include-Template (z. B. incl_fast_includes.htm) im Bereich {Incl-Basket} folgenden Code:

{Incl-Basket}
   ...
   {BASKET-PR-Data}
      ...
      {@BASKET-PR-Data}
         ...
         {!ST-BasketPage}~BASKET-PR-Quantity~{/!ST-BasketPage}
 
         {ST-BasketPage}
         <div class="basket--quantity--change" data-basketprnumber="~BASKET-PR-Number~" data-basketchangelink="~WS-EnsureNextLinkContainsURLParams~~BASKET-PR-ChangeLink~">
            <input type="hidden" basket-pr-currentval="~BASKET-PR-Quantity~">
            <div class="pr--button--input--container">
               <button type="button" class="btn btn-outline-dark btn--down" data-quantity="down">
                  <i class="fas fa-minus"></i>
               </button>
               <input type="text" data-quantity="input" class="form-control text-center basket-quantity-input input--border" name="~PR-Quantity_Input~" value="~BASKET-PR-Quantity~" min="0">
               <button type="button" class="btn btn-outline-dark btn--up" data-quantity="up">
                  <i class="fas fa-plus"></i>
               </button>
            </div>
         </div>
         {/ST-BasketPage}
 
      {/@BASKET-PR-Data}
      ...
   {/BASKET-PR-Data}
   ...  
{/Incl-Basket}

Schritt 5: Neues Template anlegen

Legen Sie ein neues Template an und speichern Sie dieses in Ihrem Template-Verzeichnis (z. B. benutzer/templates/translation) unter dem Namen incl_basket_quantity_change.htm.

Fügen Sie folgenden Inhalt in das Template ein:

...
<WS-Ajax-quantity--change--ajax--~WS-OTPProductNumber~>
{PR-Data}
   <form action="~FORM-Product~" method="Post" class="productform--basket--quantity" id="productform--basket--quantity--~PR-Number~">
      {ST-PR_Change}
      ~PR-PrintHiddenDepVariations~
      <!-- Inputfeld wird benötigt, um korrekte Response zu erhalten (~BT-ProductAddToBasket_Ajax~) -->
      <input type="hidden" name="~BT-ProductAddToBasket_Ajax~" value="~PR-Number~">
 
      <input type="hidden" id="num_~PR-Number~" data-basketprnumber="~PR-Number~" class="ajax-quantity-hidden-change"
       name="~PR-Quantity_Input~" value="~PR-Quantity~" min="0">
      {/ST-PR_Change}
   </form>
{/PR-Data}
</WS-Ajax-quantity--change--ajax--~WS-OTPProductNumber~>
...

Schritt 6: Definition des AJAX-Bereiches ws_basket_ajax_error.htm

Ergänzen Sie auf ws_basket_ajax_error.htm folgenden Code:

<!-- Menge ändern im Warenkorb -->
<WS-Ajax-basket--quantity--change--error>
    ~MSG-Notify~
</WS-Ajax-basket--quantity--change--error>

Schritt 7: Definition des AJAX-Bereiches ws_basket_ajax_success.htm und Neu-Laden des kompletten Warenkorbes nach erfolgreicher Mengen-Änderung

Ergänzen Sie auf ws_basket_ajax_success.htm folgenden Code:

<WS-Ajax-ws--basket>
   <!-- Warenkorb noch einmal laden, z. B. durch einen Include -->
   ~WS-Fast_Include(Incl-Basket)~
</WS-Ajax-ws--basket>

 

Haben Sie alle Schritte durchgeführt, ist die Funktion "Menge im Warenkorb ändern" vollständig integriert.