Hallo zusammen, ich habe folgendes Problem:
Wenn man Artikel inkl. Varianten über
POST https://shop.de/api/product
Anlegt, ist das auf ca. 400 Varianten beschränkt, weil es sonst zu einem Speicherüberlauf kommt.
Wie kann man in einem Request mehr als 1000 Varianten als „children“ neu anlegen?
In Shopware 5 machte ich das so:
1 Block mit 50 „variants“ übergeben (POST)
Alle weiteren Varianten in Blöcken zu je 50 Stück übergeben (PUT)
Shopware war so schlau, und hat die weiteren Varianten dann neu angelegt, falls noch nicht vorhanden.
In Shopware 6 bekomme ich folgenden Fehler:
Expected command for „product“ to be Shopware\Core\Framework\DataAbstractionLayer\Write\Command\UpdateCommand". (Got: Shopware\Core\Framework\DataAbstractionLayer\Write\Command\InsertCommand)
Da erkennt er wohl, dass die fehlenden Artikel noch nicht existieren, kann sie wegen „PATCH“ aber nicht neu anlegen.
Und wenn ich stattdessen „POST“ nutze, kommt dieselbe Fehlermeldung, nur genau andersrum.
Wie übergebt ihr mehr als 500 Varianten?
Vielen Dank für eure Hilfe
Ohne es 100% zu wissen (müsste nachsehen), legt man Varianten nicht als eigene Produkte an mit der ParentId als Zusatz? Zum Schluss (Zeitpunkt ist eigentlich egal) must du noch beim Parent den Configurator korrekt angeben, damit im Frontend die Varianten richtig dargestellt werden.
Hatte neulich ein Projekt, das hatte über 100.000 Varianten. Da wurde gewiss auch nicht alles auf einmal übergeben, sondern nach und nach.
Wenn du die Indexierung ausstellst beim anlegen, dann geht das ganze auch 80% schneller. Musst halt danach den Index neu erstellen lassen.
@Max_Shop Danke, die ConfiguratorSettings gebe ich im Master-Artikel an und die Options bei den Children.
Das funktioniert bis ca. 400 Varianten ja auch fehlerfrei.
Über welchen Endpoint kann ich den mehrere Artikel BULK neu anlegen?
_action/sync lässt ja nur upsert und delete zu?
Wenn es einen Endpunkt gibt, über den ich mehrere Artikel als Array neu anlegen kann, würde mir das schon helfen.
Ja, die _action/sync ist die richtige.
Was ist an upsert falsch? Das ist eine Kombination aus insert oder update.
upsert
: The Sync API does not differ between create and update operations, but always performs an upsert operation. During an upsert, the system checks whether the entity already exists in the system and updates it if an identifier has been passed, otherwise a new entity is created with this identifier.
@Max_Shop Danke, habe ich gerade ausprobiert. Leider resultiert die Übergabe in einem 500er Server Error ohne weitere Erklärung.
Noch eine Frage: kannst du mir sagen, wie man die Hauptvariante festlegt? Bei 100 hochgeladenenen Varianten zeigt Shopware eine x-beliebige Variante in der Storefront in der Liste an. Wie kann man die Hauptvariante festlegen?
Im Backend, Storefront-Darstellung (rechts oben, innerhalb der Varianten). Müsstest im XHR des Backend nachsehen, wie der API-Call dazu ist.
500er ist ein Fehler, Memory-Limit oder … da wird an deinem API-Call etwas falsch sein.
@Max_Shop Danke dir. Wenn ich im Backend eine Haupt-Variante für die Anzeige wähle, dann wird sowohl in der Liste als auch als Detail-Produkt das gewählte Produkt angezeigt.
So wie es sein soll.
Im Request im Backend wird dazu aber ein product JSON mit mehreren tausend Zeilen abgefeuert und ich kann nicht sehen, welches Element nun für die Anzeige der Haupt-Variante zuständig ist.
mainVariantId
…wird u.a. gesetzt, aber die setze ich auch. Dadurch wird korrekt der richtige Artikel (z.B. Blau) in der Liste angezeigt.
Beim Raufklicken auf den Artikel wird dann plötzlich Rot angezeigt.
Du weißt nicht zufällig, mit welchem Attribut ich steuern kann, welche Variante SOWOHL in der Liste ALS auch in der Detailansicht angezeigt werden soll?
Die Auswahl im Detail… gibt es auch bei den Einstellungen (rechts oben), dort aber die Sortierung (steht eher links).
Nicht auswendig. Erstellt doch einfach ein Produkt mit 2 Varianten und schau dir anhand der XHR an, was Shopware macht. Dann hast du alles übersichtlich kompakt.
@Max_Shop Vielen lieben Dank.
Habe es jetzt geschafft, über _action/sync alle Varianten gesplittet zu übergeben.
Der „Fehler“ war wohl, dass ich die Varianten als children übergeben habe. Jetzt übergebe ich sie mit derselben Payload einfach als eigenständigen Artikel (also nicht als children) mit Angabe der parentId und es funktioniert.
Der Tipp mit den 2 Varianten ist auch gut, werde ich gleich versuchen