ich möchte Preise und Bestände stündlich aktualisiert aus dem Warenwirtschaftssystem im Shop updaten.
Das Warenwirtschaftssystem basiert auf einer MySQL-Datenbank, nennen wir sie Datenbank A. Die Shopware Datenbank nennen wir Datenbank B.
Was ist hier Best Practice?
Ansatz: Ich könnte ganz einfach, die Preis- und Bestandsdaten aus Datenbank A direkt in die Datenbank B übertragen mit einem kleinen Skript (Java, Python, wie auch immer), welches ich auf einem Server stündlich einmal laufen lasse.
Ansatz: Ich erstelle aus Preis- und Bestandsdaten aus Datenbank A mit kleinem Skript eine CSV-Datei, lade sie auf den Shop-FTP hoch und lasse im Anschluss ein PHP-Skript laufen, wo ich die Bestände und Preise mittels Shopware SDK in PHP auf dem Webserver update.
Ansatz: Ich schreibe ein Skript, welches die Preis- und Bestandsdaten aus Datenbank A in kompatibles JSON umwandelt und schicke diese POSTs an die REST-API vom Shop.
Natürlich liebäugle ich mit Ansatz 1 als „Quick-and-dirty“-Methode, weiß aber nicht, ob das so sicher ist, die Preise und vor allem die Bestände „hart“ zu überschreiben.
Freue mich über jede Antwort! Vielen Dank im Voraus!
Version 1) würde ich ausschließen. Gerade die Preise sind sehr komplex und auch die Bestandsführung. Da musst du ganz genau wissen, was du machst.
Verwende das Shopware DAL dafür.
verwende die Shopware API um Änderungen vorzunehmen.
Änderungen direkt in der Datenbank vorzunehmen wäre nicht ideal, da so ggf. weitere Prozesse nicht angestoßen werden.
Über die Shopware API werden z.B. an einigen Stellen entsprechende Events geworfen, die dazu führen, dass weiterer Code ausgeführt wird.
Über die direkte Änderungen der Daten in der Datenbank würden die Events nicht geworfen werden.
Guten Abend,
sofern keine komplexeren regelbasierten Preise hinterlegt sind, geht es, auch bei vielen Produkten, zuverlässig über einen POST an /api/_action/sync
Hier eine kleine JSON-Vorlage hier als PHP-Array
'write-rules' => [
'action' => 'upsert',
'entity' => 'product',
'key' => 'write', // Todo Was macht es genau?
'payload' => [ // payload pro entity, hier product
[ // product 1
'id' => 'ProductUuid',
'stock' => xxx,
'price' => [ // Preis gilt pro Währung
[
'currencyId' => 'b7d2554b0ce847cd82f3ac9bd1c0dfca', // EUR default
'net' => 100,
'gross' => 119,
'linked' => true,
],
],
],
],
]
Ein Update über die Artikelnummer (zusammen mit der taxId und dem Artikelnamen) schlägt leider mit CONTENT__DUPLICATE_PRODUCT_NUMBER fehl obwohl es sich um das angepriesene „upsert“ handelt. Hier besteht Nachbesserungsbedarf. Die ProductUuid muss also vorher separat abgefragt werden.
Die Shopware docs dazu sind nicht erschöpfend aber zumindest für den Anfang hilfreich: