Über Magentos GraphQL lassen sich bei einem konfigurierbaren Produkt neben den normalen Produktdaten auch die konfigurierbaren Attribute und die zugehörigen Child Produkte abfragen.
Eine entsprechende Abfrage kann beispielsweise so aussehen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
{ products( filter: { sku: { eq: "CONFIGURABLE-SKU" } } ) { items { sku name ... on ConfigurableProduct { configurable_options { attribute_code label values { uid label } } variants { product { sku name stock_status } } } } } } |
Der Ausdruck … on ConfigurableProduct ist ein sogenanntes Inline Fragment. Die normale Products Abfrage kann unterschiedliche Produkttypen zurückgeben. Über das Fragment werden deshalb zusätzlich die Felder abgefragt, die nur bei einem konfigurierbaren Produkt vorhanden sind.
Über configurable_options liefert Magento die verwendeten konfigurierbaren Attribute und deren mögliche Werte. Unter variants stehen anschließend die zugeordneten einfachen Produkte inklusive SKU und Lagerstatus zur Verfügung.
Eine Antwort kann dann z.B. so aussehen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
{ "data": { "products": { "items": [ { "sku": "SHIRT", "name": "T-Shirt", "configurable_options": [ { "attribute_code": "color", "label": "Farbe", "values": [ { "uid": "Y29uZmlndXJhYmxlLzEwLzUy", "label": "Schwarz" }, { "uid": "Y29uZmlndXJhYmxlLzEwLzUz", "label": "Weiß" } ] } ], "variants": [ { "product": { "sku": "SHIRT-BLACK", "name": "T-Shirt Schwarz", "stock_status": "IN_STOCK" } }, { "product": { "sku": "SHIRT-WHITE", "name": "T-Shirt Weiß", "stock_status": "OUT_OF_STOCK" } } ] } ] } } } |
Die Daten können anschließend im Frontend direkt weiterverarbeitet werden. Sollen beispielsweise nur lieferbare Varianten berücksichtigt werden, lässt sich die Antwort entsprechend filtern:
|
1 2 3 4 5 6 7 8 9 10 |
const product = response.data.products.items[0]; const availableVariants = product.variants .filter(variant => variant.product.stock_status === 'IN_STOCK') .map(variant => ({ sku: variant.product.sku, name: variant.product.name })); console.log(availableVariants); |
Das Ergebnis enthält in diesem Beispiel nur noch das verfügbare Child Produkt:
|
1 2 3 4 5 6 |
[ { "sku": "SHIRT-BLACK", "name": "T-Shirt Schwarz" } ] |
Damit liefert Magento über eine einzige GraphQL Abfrage nicht nur das konfigurierbare Produkt selbst, sondern auch die Struktur seiner Optionen und die dazugehörigen Varianten. Gerade bei eigenen Frontends lässt sich daraus direkt die Auswahl der verfügbaren Produktvarianten aufbauen.