Zum Hauptinhalt springen
Mit dem $wsInventory-Modul lesen Sie Lagerbestände und Verfügbarkeiten von Produkten sowie die Reservierungszeit eines Warenkorb-Eintrags. Typische Anwendungsfälle sind Ampel-Anzeigen (grün/gelb/rot), Verfügbarkeitshinweise auf Produktseiten und der ablaufende Reservierungs-Timer im Warenkorb. Auf dieser Seite geht es um das Lesen und Anzeigen von Bestandsdaten. Eine Reservierung kann über die Aktion InventoryReserve ($wsActions) verlängert werden. Die Storefront-API Lagerbestand behandelt serverseitige Bestandsdaten.

Grundkonzept

$wsInventory liefert zwei verschiedene Datenpunkte:

Zuerst auf aktive Lagerverwaltung prüfen

Die Bestandsdaten sind nur aussagekräftig, wenn für das Produkt die Lagerverwaltung aktiv ist. Prüfen Sie deshalb immer zuerst active, bevor Sie Stückzahl, Ampel oder Lieferstatus anzeigen, ansonsten zeigen Sie Werte an, die für dieses Produkt gar nicht gepflegt werden.

Ampel-Logik

state fasst die Verfügbarkeit als Ampel zusammen: green (ausreichend vorrätig), yellow (wenige Stück) und red (ausverkauft oder sehr knapp). Damit zeigen Sie dem Kunden auf einen Blick, wie es um die Lieferbarkeit steht, ohne selbst Schwellen zu berechnen.

Reservierungs-Lebenszyklus

Wird ein Produkt in den Warenkorb gelegt, ist es für eine bestimmte Zeit reserviert. loadReservation() liefert die verbleibende Zeit in Sekunden (duration). Läuft sie ab (duration <= 0), kann der Kunde über die Aktion InventoryReserve erneut reservieren.

Modulübersicht

Beispiel / Ausschnitt über $wsInventory
{{= $wsInventory | json }}
JSON-Ausgabe
{
  "load": "ƒ()",
  "loadReservation": "ƒ()"
}
Anmerkung: "ƒ()" kennzeichnet eine Funktion. Methoden in der Übersicht
MethodeRückgabe-TypBeschreibung
load()mapLädt die Lagerbestandsdaten eines Produkts.
loadReservation()mapLädt die Reservierungsdaten eines Warenkorb-Eintrags.

Templates

Bestands- und Verfügbarkeitsinformationen werden typischerweise dort geladen, wo Produkte erscheinen: Startseite, Kategorieliste, Suchergebnisse, Produktdetailseite und Warenkorb.

Variablen

Für $wsInventory stehen keine eigenen Variablen zur Verfügung. Die Daten werden über die Methoden geladen.

Methoden

$wsInventory.load()

Lädt die Lagerbestandsdaten eines Produkts. Signatur
$wsInventory.load(productId)
Rückgabe
map – Lagerbestandsdaten (siehe Tabelle).
Parameter
NameTypPflichtBeschreibung
productIdstringjaID des Produkts.
Rückgabewerte
EigenschaftTypBeschreibung
activebooltrue, wenn die Lagerverwaltung für dieses Produkt aktiv ist.
amountintVerfügbare Stückzahl (kann null sein, wenn der Bestand nicht gezählt wird).
amountInStockintAm Lager befindliche Menge (häufig null; im Test nur bei ausverkauften Produkten als 0 beobachtet).
amountNotInStockintNicht am Lager befindliche Menge (häufig null).
statestringAmpelstatus: green, yellow oder red.
soldOutbooltrue, wenn das Produkt ausverkauft ist.
deliveryTextstringLieferstatus-Text (z. B. „Nur noch wenige Stück auf Lager”).
messageLimitintStückzahl, ab der deliveryText angezeigt wird.
splitDeliverybooltrue, wenn auch bei Teillieferung bestellt werden kann.
{{ var $inventory = $wsInventory.load($product.id) }}
{{ if $inventory.active }}
  {{= $inventory.deliveryText }} – verfügbar: {{= $inventory.amount }} Stück
{{ /if }}

$wsInventory.loadReservation()

Lädt die Reservierungsdaten eines Warenkorb-Eintrags. Signatur
$wsInventory.loadReservation(basketItemId)
Rückgabe
map – Reservierungsdaten.
Parameter
NameTypPflichtBeschreibung
basketItemIdstringjaID des Warenkorb-Eintrags (Eintrags-Hash, siehe $wsBasket).
Rückgabewerte
EigenschaftTypBeschreibung
durationintVerbleibende Reservierungszeit in Sekunden (<= 0 bedeutet abgelaufen).
reservedUntilstringZeitpunkt des Ablaufs (ISO 8601, UTC; einen date-Filter gibt es nicht).
{{ var $reservation = $wsInventory.loadReservation($basketItem.id) }}
{{ if $reservation }}
  {{ if $reservation.duration > 0 }}
    Reserviert für {{= $reservation.duration }} Sekunden.
  {{ else }}
    Reservierung abgelaufen.
  {{ /if }}
{{ /if }}

Aktionen

$wsInventory selbst stellt keine Aktionen bereit. Eine abgelaufene Reservierung wird über die $wsActions-Aktion InventoryReserve erneuert (siehe Beispiel).

Beispiele

Verfügbarkeit als Ampel anzeigen

Prüft zuerst active und zeigt dann den Ampelstatus farbig an.
{{ var $inventory = $wsInventory.load($product.id) }}
{{ if $inventory.active }}
  {{ switch $inventory.state }}
    {{ case "green" }}
      <span style="color: green;">Verfügbar</span>
    {{ case "yellow" }}
      <span style="color: orange;">Nur noch wenige Stück</span>
    {{ case "red" }}
      <span style="color: red;">Nicht lieferbar</span>
  {{ /switch }}
{{ /if }}
Ergebnis
Bei aktiver Lagerverwaltung erscheint je nach state ein grüner, gelber oder roter Hinweis.

Reservierungszeit als Countdown anzeigen

Rechnet die Sekunden aus duration in Minuten und Sekunden um.
{{ if $reservation and $reservation.duration > 0 }}
  {{ var $sec = $reservation.duration % 60 }}
  {{ var $min = ($reservation.duration - $sec) / 60 }}
  Das Produkt ist noch
  {{ if $min > 0 }}<strong>{{= $min }} Minuten</strong> und {{ /if }}
  <strong>{{= $sec }} Sekunden</strong> für Sie reserviert.
{{ else }}
  Ihre Reservierung ist abgelaufen.
{{ /if }}
Ergebnis
Solange die Reservierung läuft, sieht der Kunde die verbleibende Zeit. Danach den Ablauf-Hinweis.

Reservierung verlängern

Ist die Reservierung abgelaufen, bietet dieses Beispiel über die Aktion InventoryReserve eine Neureservierung an.
{{ var $reservation = $wsInventory.loadReservation($basketItem.id) }}
{{ if $reservation }}
  {{ var $reserve = $wsActions.create("InventoryReserve", tag=$basketItem.id) }}

  {{ if $reservation.duration > 0 }}
    Das Produkt ist für Sie reserviert.
  {{ else }}
    Ihre Reservierung ist abgelaufen.
    <form method="post" action="{{= $wsViews.viewUrl('basket.htm') }}">
      <input type="hidden" name="wscsrf" value="{{= $reserve.csrf }}">
      <input type="hidden" name="wsact" value="{{= $reserve.id }}">
      <input type="hidden" name="wstarget" value="{{= $wsViews.viewUrl('basket.htm') }}">
      <input type="hidden" name="basketItemId" value="{{= $basketItem.id }}">
      <button type="submit">Neu reservieren</button>
    </form>
  {{ /if }}

  {{ if $reserve.success }}
    <p>Die Menge wurde erfolgreich neu reserviert.</p>
  {{ /if }}
  {{ if $reserve.error }}
    <p>Die Reservierung konnte nicht verlängert werden.</p>
  {{ /if }}
{{ /if }}
Ergebnis
Bei abgelaufener Reservierung erscheint ein „Neu reservieren”-Button. Nach erfolgreicher Aktion die Bestätigung.

  • $wsActions – stellt die Aktion InventoryReserve zum Verlängern einer Reservierung bereit.
  • $wsBasket – liefert die Warenkorb-Einträge, deren ID loadReservation() erwartet.
  • $wsStores – Filialfinder, relevant für die StorageID bei Click & Collect.
  • Storefront-API Lagerbestand – serverseitiger Zugriff auf Bestandsdaten.