Quick Order in Magento 2: Die Backend-API hinter der SKU-Schnellbestellung
AI generated
M2
di.xml
Magento 2 · B2B Suite
Quick Order
Die Backend-API hinter der SKU-Schnellbestellung

Quick Order erlaubt Firmenkunden, direkt über eine Liste von SKUs und Mengen zu bestellen, ohne sich durch den Katalog zu klicken, gestützt auf dieselbe GraphQL-Mutation, die auch für eigene Frontend-Implementierungen wie einen CSV-Upload zur Verfügung steht. Wer eine eigene Oberfläche darauf bauen will, muss die Validierungslogik, die strukturierten Fehlercodes und die Performance-Grenzen bei großen SKU-Listen kennen.

12 Min. Lesezeit Quick Order · B2B Suite Magento 2.4.x Commerce

1. Quick Order im B2B-Storefront einordnen

Quick Order ist eine Storefront-Funktion der B2B-Suite, mit der Firmenkunden eine Liste aus SKUs und Mengen direkt eingeben oder einfügen können, statt jedes Produkt einzeln über die Suche oder die Kategorie-Navigation zu finden. Fachlich richtet sich das Feature an Kunden, die genau wissen, was sie bestellen wollen, etwa anhand einer eigenen internen Bestellliste oder eines Preislisten-Exports.

Technisch ist Quick Order keine eigenständige neue API, sondern eine dedizierte Storefront-Oberfläche über derselben Cart-Mutation, die Magento auch für das reguläre Hinzufügen mehrerer Produkte zum Warenkorb verwendet. Der eigentliche Mehrwert von Quick Order liegt also weniger im Backend als in der Kombination aus schneller Eingabemaske, Autovervollständigung und einer Antwortstruktur, die gezielt für viele gleichzeitige Positionen ausgelegt ist.

2. Der Ablauf: von der SKU-Liste zum Warenkorb

Der Ablauf hinter Quick Order lässt sich in drei Schritte gliedern: Zunächst wird die eingegebene Liste aus SKU-Mengen-Paaren an das Backend übertragen, dort erfolgt eine Validierung jeder einzelnen Position gegen Produktkatalog, Preis und Lagerbestand, und abschließend werden alle gültigen Positionen gemeinsam dem aktiven Warenkorb hinzugefügt. Ungültige Positionen blockieren dabei nicht automatisch die gültigen, sondern werden separat zurückgemeldet.

Dieses Verhalten unterscheidet sich bewusst von einem klassischen Formular-Submit mit Alles-oder-nichts-Logik. Bei einer Liste mit fünfzig Positionen, von denen zwei ungültig sind, werden die restlichen achtundvierzig trotzdem in den Warenkorb übernommen, während die beiden fehlerhaften Positionen mit einem konkreten Fehlercode zurückgemeldet werden, sodass der Kunde gezielt nachbessern kann, statt die komplette Eingabe zu wiederholen.

3. Die zugrunde liegende GraphQL-Mutation

Backendseitig läuft eine Quick-Order-Anfrage über dieselbe addProductsToCart-Mutation, die auch für andere Bulk-Warenkorb-Operationen verwendet wird. Sie akzeptiert eine Liste aus Cart-Items mit SKU und Menge und liefert im Antwortobjekt sowohl den aktualisierten Warenkorb als auch eine Liste von user_errors zurück, in der jede fehlgeschlagene Position einzeln mit einem sprechenden Fehlercode aufgeführt wird.

Für eigene Frontend-Implementierungen ist wichtig, diese Antwortstruktur konsequent auszuwerten, statt nur zu prüfen, ob die Mutation insgesamt erfolgreich war. Eine Mutation ohne technischen Fehler kann trotzdem mehrere user_errors enthalten, wenn einzelne Positionen aus fachlichen Gründen nicht übernommen werden konnten, etwa weil eine SKU nicht existiert oder ein Produkt gerade nicht verkäuflich ist.


mutation QuickOrderAddToCart {
  addProductsToCart(
    cartId: "abc123cartid"
    cartItems: [
      { sku: "SKU-1001", quantity: 5 }
      { sku: "SKU-1002", quantity: 12 }
      { sku: "SKU-UNKNOWN", quantity: 3 }
    ]
  ) {
    cart {
      id
      total_quantity
    }
    user_errors {
      code
      message
    }
  }
}

4. Eigene CSV-Upload-Frontends aufbauen

Für einen CSV-Upload, der über die Standard-Quick-Order-Eingabemaske hinausgeht, lässt sich dieselbe Mutation wiederverwenden: Die CSV-Datei wird geparst, in eine Liste aus SKU-Mengen-Paaren überführt und anschließend an addProductsToCart übergeben. Der Vorteil dieses Ansatzes ist, dass keine eigene Validierungslogik dupliziert werden muss, sondern dieselbe serverseitige Prüfung wie bei der Standard-Quick-Order-Eingabe greift.

Bei sehr großen CSV-Dateien mit mehreren hundert oder tausend Zeilen empfiehlt sich, die Datei nicht als eine einzige Mutation zu übertragen, sondern in Chargen von beispielsweise fünfzig bis hundert Positionen aufzuteilen. Das begrenzt sowohl die Laufzeit eines einzelnen Requests als auch das Risiko, dass ein einzelner sehr großer Request an einem Timeout in der Infrastruktur zwischen Frontend und Magento scheitert.


<?php

declare(strict_types=1);

namespace Mironsoft\QuickOrderExtension\Model;

/**
 * Teilt eine große Liste aus SKU-Mengen-Paaren in verarbeitbare Chargen auf,
 * um addProductsToCart nicht mit tausenden Positionen in einem Aufruf zu belasten.
 */
class SkuBatchSplitter
{
    private const DEFAULT_BATCH_SIZE = 75;

    /**
     * @param array<int, array{sku: string, qty: float}> $items
     * @param int $batchSize
     * @return array<int, array<int, array{sku: string, qty: float}>>
     */
    public function split(array $items, int $batchSize = self::DEFAULT_BATCH_SIZE): array
    {
        return array_chunk($items, $batchSize);
    }
}

5. Serverseitige SKU-Validierung im Detail

Die Validierung einer einzelnen SKU im Backend prüft mehrere Dinge nacheinander: Existiert die SKU überhaupt im Produktkatalog, ist das Produkt im aktuellen Store sichtbar und aktiviert, und im Fall eines konfigurierbaren Produkts, verweist die eingegebene SKU auf eine konkrete Kindvariante oder auf das übergeordnete, nicht direkt bestellbare Elternprodukt. Letzteres ist eine häufige Fehlerquelle bei eigenen Implementierungen, weil Kunden aus Preislisten oft die Eltern-SKU statt der Varianten-SKU kopieren.

Für eigene Erweiterungen, die zusätzliche SKU-Normalisierung benötigen, etwa Groß- und Kleinschreibung zu ignorieren oder führende Nullen zu entfernen, bietet sich eine Vorverarbeitung der eingegebenen Liste vor dem eigentlichen Mutation-Aufruf an, statt die Normalisierung tief in der Kernvalidierung zu verändern, was mit zukünftigen B2B-Suite-Updates kollidieren könnte.

6. Fehlerbehandlung: Teilerfolg sauber kommunizieren

Weil eine Quick-Order-Anfrage typischerweise aus vielen Positionen besteht, ist die größte Herausforderung für ein eigenes Frontend nicht die einzelne Fehlermeldung, sondern die verständliche Darstellung eines Teilerfolgs. Ein Nutzer, der eine CSV mit hundert Zeilen hochlädt und nur die Meldung erhält, dass drei Fehler aufgetreten sind, kann ohne Zuordnung zur ursprünglichen Zeile kaum sinnvoll reagieren.

Die robuste Lösung ist, beim Aufbau der cartItems-Liste den Zeilenindex der ursprünglichen CSV mitzuführen, etwa als eigenes Feld im internen Datenmodell, und die zurückgemeldeten user_errors anhand der betroffenen SKU wieder der passenden Ursprungszeile zuzuordnen. So kann das Frontend dem Nutzer exakt zeigen, welche Zeile korrigiert werden muss, statt nur eine allgemeine Fehlerzahl anzuzeigen.

7. Lagerbestand und Backorders bei der Prüfung

Die Bestandsprüfung einer Quick-Order-Position läuft über dieselbe MSI-Logik wie an anderer Stelle im Shop und berücksichtigt die aggregierte verkaufsfähige Menge über alle zugewiesenen Sources hinweg, nicht den Bestand einer einzelnen Quelle isoliert. Ob eine Menge oberhalb des aktuellen Bestands zu einem harten Fehler oder zu einer akzeptierten Backorder-Position führt, hängt von der Backorder-Konfiguration des jeweiligen Produkts ab.

Für eigene Frontends ist relevant, dass eine erfolgreiche Backorder-Position keinen Fehler in user_errors erzeugt, sich aber im Warenkorb typischerweise durch einen zusätzlichen Hinweis zur Lieferzeit unterscheidet. Wer eine eigene Zusammenfassung nach dem Quick-Order-Vorgang anzeigen will, sollte diesen Fall separat behandeln, statt jede Position ohne expliziten Fehler unterschiedslos als vollständig verfügbar darzustellen.

8. Quick Order per Plugin gezielt einschränken

Für manche Kataloge ist sinnvoll, bestimmte Produkttypen von der Schnellbestellung auszuschließen, etwa virtuelle oder downloadbare Produkte, die im normalen Bestellprozess zusätzliche Angaben erfordern, die eine reine SKU-Mengen-Eingabe nicht abbilden kann. Dafür bietet sich ein Plugin auf dem Resolver oder Service an, der die einzelne Position validiert, mit einer zusätzlichen Prüfung des Produkttyps vor der eigentlichen Bestands- und Preisvalidierung.

Ebenso lässt sich über denselben Mechanismus eine Mindestbestellmenge pro SKU durchsetzen, die über die reguläre Produktkonfiguration hinausgeht, etwa weil bestimmte Artikel ausschließlich in Paletten- statt Einzelmengen über Quick Order bestellt werden dürfen. Wichtig ist, denselben Fehlerkanal wie die Standardvalidierung zu nutzen, damit sich eigene und Standard-Fehlercodes im Frontend einheitlich behandeln lassen.

9. Performance bei großen SKU-Listen

Bei einer Quick-Order-Anfrage mit vielen Positionen ist die größte Performance-Falle, für jede Position einzeln und nacheinander Preis- und Bestandsdaten aus der Datenbank zu laden, statt die zugrunde liegenden Repositories mit ihren Bulk-Lademethoden zu nutzen. Wer eine eigene Erweiterung der Validierung baut, sollte konsequent auf Methoden setzen, die mehrere SKUs in einem einzigen Aufruf laden, statt die Anzahl der Datenbankabfragen linear mit der Listenlänge wachsen zu lassen.

Für sehr hohe Volumina, etwa eine automatisierte nächtliche Bestellung aus einem angebundenen ERP-System, lohnt sich außerdem, denselben Validierungspfad wie im interaktiven Quick-Order-Formular zu verwenden, aber außerhalb der synchronen Request-Antwort-Zeit eines Nutzers auszuführen, etwa über einen Message-Queue-Consumer, damit große Bestellmengen den regulären Storefront-Traffic nicht ausbremsen.

Fehlercode Ursache Verhalten Empfehlung für Frontend
PRODUCT_NOT_FOUND SKU existiert nicht im Katalog Position wird nicht hinzugefügt Zeile markieren, Tippfehler-Hinweis anzeigen
NOT_SALABLE Bestand reicht nicht, keine Backorder erlaubt Position wird nicht hinzugefügt Verfügbare Menge zurückmelden
INSUFFICIENT_STOCK Angeforderte Menge übersteigt Bestand Teilmenge oder Ablehnung je nach Konfiguration Alternative Menge vorschlagen
PRODUCT_NOT_PURCHASABLE Produkt deaktiviert oder nicht sichtbar Position wird nicht hinzugefügt Aus zukünftigen Uploads herausfiltern
INVALID_QUANTITY Menge ist null, negativ oder ungültig formatiert Position wird nicht hinzugefügt Eingabeformat vor dem Absenden prüfen

Mironsoft

Magento-Entwicklung, Modul-Beratung und Systemarchitektur

Magento-Projekt, das eine zweite Meinung oder erfahrene Umsetzung braucht?

Wir entwickeln individuelle Magento-Module, beraten bei Architekturentscheidungen und übernehmen komplexe Umsetzungen, von der Service-Contract-Planung bis zum produktionsreifen Deployment.

Architektur-Beratung

Modul- und Systemarchitektur vor der Umsetzung fundiert durchdenken lassen.

Custom-Modul-Entwicklung

Individuelle Magento-Module nach Best Practices sauber umsetzen.

Code-Review & Audit

Bestehende Module auf Performance, Sicherheit und Wartbarkeit prüfen lassen.

10. Zusammenfassung

Quick Order Backend-API

Technische Basis

Quick Order nutzt dieselbe addProductsToCart-Mutation wie andere Bulk-Warenkorb-Operationen.

Fehlerbehandlung

Ungültige Positionen blockieren gültige nicht, sondern werden granular über user_errors zurückgemeldet.

CSV-Integration

Eigene Uploads lassen sich über dieselbe Mutation in Chargen verarbeiten, ohne Validierung zu duplizieren.

Performance

Bulk-Lademethoden statt Einzelabfragen pro SKU sind bei großen Listen entscheidend.

11. FAQ: Quick Order Backend-API

1Ist Quick Order eine eigenständige API?
Nein, Quick Order ist eine dedizierte Storefront-Oberfläche über derselben addProductsToCart-Mutation, die auch für andere Bulk-Warenkorb-Operationen verwendet wird.
2Was passiert, wenn einige SKUs in der Liste ungültig sind?
Gültige Positionen werden trotzdem dem Warenkorb hinzugefügt, während ungültige Positionen einzeln mit einem Fehlercode in user_errors zurückgemeldet werden.
3Lässt sich dieselbe Mutation für einen eigenen CSV-Upload nutzen?
Ja, die CSV-Datei wird geparst, in SKU-Mengen-Paare überführt und an addProductsToCart übergeben, wodurch dieselbe serverseitige Validierung greift.
4Wie sollten sehr große CSV-Dateien verarbeitet werden?
In Chargen von etwa fünfzig bis hundert Positionen statt in einer einzigen Mutation, um Laufzeit und Timeout-Risiko zu begrenzen.
5Warum schlägt die Eingabe der Eltern-SKU eines konfigurierbaren Produkts fehl?
Weil die eingegebene SKU auf eine konkrete Kindvariante verweisen muss, das übergeordnete Elternprodukt ist über Quick Order nicht direkt bestellbar.
6Wie lässt sich ein Teilerfolg sinnvoll im Frontend darstellen?
Indem der Zeilenindex der ursprünglichen Eingabe mitgeführt und die zurückgemeldeten user_errors anhand der SKU wieder der passenden Zeile zugeordnet werden.
7Erzeugt eine akzeptierte Backorder-Position einen Fehler?
Nein, eine erfolgreiche Backorder erscheint nicht in user_errors, unterscheidet sich im Warenkorb aber typischerweise durch einen zusätzlichen Lieferzeit-Hinweis.
8Wie lassen sich bestimmte Produkttypen von Quick Order ausschließen?
Über ein Plugin auf dem validierenden Resolver oder Service, das den Produkttyp vor der Bestands- und Preisvalidierung zusätzlich prüft.
9Was ist die größte Performance-Falle bei großen SKU-Listen?
Preis- und Bestandsdaten einzeln pro SKU statt über Bulk-Lademethoden der Repositories zu laden, wodurch die Anzahl der Datenbankabfragen linear wächst.
10Wie lassen sich sehr hohe Bestellvolumina aus einem ERP-System sinnvoll verarbeiten?
Über denselben Validierungspfad wie im interaktiven Formular, aber ausgeführt über einen Message-Queue-Consumer außerhalb der synchronen Nutzer-Antwortzeit.