Hallo! Ich habe einen nachvollziehbaren Fehler in 4.2.3 und 4.3 lokalisiert, und zwar kracht es, wenn Artikel über die API-Resource mit einer im System noch nicht vorhandenen Unit importiert werden. Laut API-Wiki sollte das aber funktionieren: [quote] ‘mainDetail’ => array( ‘number’ => ‘turn33’, ‘prices’ => array( array( ‘customerGroupKey’ => ‘EK’, ‘price’ => 999, ), ), ‘unit’ => array( ‘unit’ => ‘xyz’, ‘name’ => ‘Neue Einheit’ ) ) [/quote] Wenn die Unit mit “unit” und “name” angegeben wird, wird laut Doku ein vorhandener Datensatz gesucht - wenn nicht vorhanden - wird er angelegt. Wenn diese Unit bereits existiert klappt der Import auch - bei neuen aber nachvollziehbar nicht! Um der Sache auf den Grund zu gehen … in der Variant Resource gibt es … //new unit data send? create new unit for this variant } elseif (!empty($data['unit'])) { $data['unit'] = $this-\>updateUnitReference($data['unit']); }
Da geht er auch rein, und versucht in der Folgemethode diese Unit auch zu erstellen: //to create a new unit, the unit name and unit is required. Otherwise we throw an exception if (!$unit && isset($unitData['name']) && isset($unitData['unit'])) { $unit = new Unit(); $this-\>getManager()-\>persist($unit); } elseif (!$unit) { throw new ApiException\CustomValidationException(sprintf('To create a unit you need to pass `name` and `unit`')); } $unit-\>fromArray($unitData); return $unit;
Es kommt nur leider nichts in der Datenbank an. Das $unit des returns beinhaltet auch keine ID oder so, scheint da zu kneifen. Als Exception kracht das create der Resource mit einer neuen und noch nicht vorhandenen Preiseinheit: Fehler: Artikel #CL-001 konnte nicht erfolgreich angelegt werden!: An exception occurred while executing 'INSERT INTO s\_articles\_details (articleID, unitID, ordernumber, suppliernumber, kind, additionaltext, active, instock, stockmin, weight, width, length, height, ean, position, minpurchase, purchasesteps, maxpurchase, purchaseunit, referenceunit, packunit, shippingfree, releasedate, shippingtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [null, 15, "CL-001", "", 1, "", true, 2053, null, 0.167, null, null, null, "4260037369143", 0, null, null, null, 1, 1, 6, 0, null, null]: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'articleID' cannot be null
In dieser Exception erscheint eine unitID, die aber offensichtlich per Transaktion am Ende nicht persistent gehalten wird. Wenn die Preiseinheit weggelassen wird bei genau dieser Erstellung klappt das create ohne Probleme. Das Problem lässt sich also ganz definiert nur auf die Angabe von “unit” und “name” des Blocks “unit” im “MainDetail” beziehen. EDIT: In einer kleinen (und einfachen) eigenen Hilfsfunktion umgehe ich das Problem, indem ich selbst nach der Einheit suche (über das Feld “unit”), wenn gefunden setze ich die “unitId” unter den “mainDetail”. Wenn die Unit nicht gefunden werden kann, erstelle ich die über das Model selbst, was funktioniert: $unitModel = new Unit(); $unitModel-\>setName($unitName); $unitModel-\>setUnit($unitName); try { Shopware()-\>Models()-\>persist($unitModel); Shopware()-\>Models()-\>flush(); return $unitModel-\>getId(); } catch (\Exception $e) { ...
Mir fällt nur auf, dass in der updateUnitReference($unitData) kein flush durchgeführt wird - kann das die Ursache sein? … Freue mich über Feedback! Schöne Grüße, Niklas
Shopware 5.1.4: Das Problem besteht immer noch.Im Beispiel zur Artikel Resource der API wird exakt auf diesen Vorgang eingegangen. Es kann doch nicht sein, dass der Beispielcode nicht funktioniert? Das Problem besteht seit über 1,5 Jahren und weder der betreffende Bereich in Shopware noch die Dokumentation wird überarbeitet?
Außerdem: Warum findet man in der API-Dokumentation nur den Verweis auf eine unitId? Wenn man es genau nimmt, stimmt diese Doku ja. Ein Unit-Objekt kann man nicht erfolgreich übergeben. Aber die Übergabe als Objekt ist ja ganz offentichtlich vorgesehen (siehe Beispiel zur Artikel Resource), da folgende Meldung zurückgegeben wird, wenn ein String als Unit übermittelt wird:
To create a unit you need to pass `name` and `unit`
Wie kann ich dieses Problem über die API lösen?
PUSH
Ok, gut zu wissen, dass meine manuelle Variante wohl immer noch leider notwendig ist …
Ich würde das nur gerne lösen, ohne Resourcen umzuschreiben, ein Plugin zu bauen oder im Core rumzudoktorn. Das sollte eigentlich eine Standardfunktionalität sein, weswegen ich mich ein wenig wundere wieso ich nicht schon mehr Beiträge zu diesem Thema gesehen habe. Mit wäre schon geholfen wenn hier jemand schreiben könnte ob er das Problem selbst nachstellen kann oder ob es bei ihm nicht auftritt. Dann könnte man zumindest mal die Systeme grob abgleichen um einzugrenzen wo der Fehler liegt…