Rest API - Anbindung hauseigener Software

Guten Morgen, wir entwickeln gerade an einer Schnittstelle von unserer WAWI zu Shopware. Dabei haben wir uns für den Weg über die REST-API entschieden. Gerade importiere ich ca. 8000 Artikel plus Images zu Shopware (läuft auf einem Server mit 32GB, SSD-Platte) gestern um 17 Uhr habe ich den Export gestartet und gerade läuft dieser immer noch und hat gerade mal 2800 Artikel importiert. Habt ihr Ideen warum dies solange dauert? Liegt das nur an de Bildern? Da wir unseren Kunden in Zukunt eine Schnittstelle anbinden wollen, würden wir ungern über direkte SQL Inserts gehen. Bin für jeden Tipp dankbar! CODE Beispiel: $createArticle = array( 'name' =\> $product['produktname'], 'supplier' =\> $product['hersteller'], 'categories' =\> array( array('id' =\> $this-\>getShopwareCatIdByCategoryId($product['kategorie\_id'], $shopDatabase)), ), 'active' =\> true, 'descriptionLong' =\> $product['beschreibung2'], 'description' =\> $product['beschreibung1'], 'tax' =\> $product['tax'], 'taxId' =\> 1, 'mainDetail' =\> array( 'active' =\> true, 'number' =\> $product['artikelnummer'], 'ean' =\> $product['ean'], 'inStock' =\> $product['lagerbestand'], 'prices' =\> array( array( 'customerGroupKey' =\> 'EK', 'basePrice' =\> $product['uvpreis'], 'price' =\> $product['preis'], ) ), //'\_\_options\_images' =\> array('replace' =\> true), 'images' =\> $imageData, ) ); $result = $client-\>put('articles/' . $product['artikelnummer'] . '?useNumberAsId=true', $createArticle); if (!$result['success']) { $result = $client-\>post('articles', $createArticle); $productVariants = $this-\>getVariantsForProduct($product['uniqueid'], $shopDatabase); if (count($productVariants) \> 0) { $id = $result['data']['id']; foreach ($productVariants as $productVariant) { //VariantsImages for($i = 0; $i \< $productVariant['bilder']; $i++) { $imageSrc = 'http://xxxxxx.bilder/1600x1600/' . $productVariant['artikelnummer'] .'\_'.$i .'.jpg'; if (@getimagesize($imageSrc)) { $imageDataVariants[$i] = array('link' =\> $imageSrc); } else { continue; } } $variantsPrice = $product['preis'] + $productVariant['preis']; $variantsOption[]['name'] = $productVariant['produktname']. ' + ' .$productVariant['preis']. ' ' .$currency['symbol']; $updateArticle = array( 'taxId' =\> 1, 'configuratorSet' =\> array( 'groups' =\> array( array( 'name' =\> 'Varianten '.$product['artikelnummer'], 'options' =\> $variantsOption ), ) ), //'\_\_option\_variants' =\> array("replace" =\> true), 'variants' =\> array( array( 'isMain' =\> false, 'active' =\> true, 'number' =\> $productVariant['artikelnummer'], 'inStock' =\> $productVariant['lagerbestand'], 'additionaltext' =\> $productVariant['produktname'], 'configuratorOptions' =\> array( array('group' =\> 'Varianten '.$product['artikelnummer'], 'option' =\> $productVariant['produktname']. ' + ' .$productVariant['preis']. ' ' .$currency['symbol'] ), ), '\_\_options\_prices' =\> array('replace' =\> true), 'prices' =\> array( array( 'customerGroupKey' =\> 'EK', 'basePrice' =\> $product['uvpreis'], 'price' =\> $variantsPrice, ), ), 'images' =\> $imageDataVariants, ) ), ); $result = $client-\>put('articles/' . $id, $updateArticle); }

frage: warum updatest du die varianten anstatt sie direkt im post mit anzulegen?

Welche Bildgröße (MByte, Auflösung) haben die Bilder? Das kann durchaus an denen liegen, wenn diese sehr groß sind. Shopware erstellt zu jedem Bild 3 Thumbnails und muss somit das Bild unter umständen 3 mal laden. Das kann lange dauern. Es kann allerdings auch am Server liegen, wenn dieser das Skript nicht schnell bearbeitet, da z. B. geringe Leistung vorhanden ist. Empehlen kann ich dir generell: Mache einen Import für Artikeldaten ohne Bilder und mache einen gesonderten für Bilder Hier stellt sich dann auch raus an was es liegt. Flitzen die Stammdaten durch wie nix, liegts an den Bildern, ist der Upload immer noch lahm, muss es am Server oder der Verbindung liegen. (Das ganze setzt vorraus, dass die Artikel-ID’s in der Warenwirtschaft hinterlegt werden. Aber davon sollte man ausgehen? :-)) Grüße

1 „Gefällt mir“

[quote]frage: warum updatest du die varianten anstatt sie direkt im post mit anzulegen?[/quote] Ich habe mich an die Shopware Dokumentation gehalten und es so verstanden, dass der Hauptartikel zuerst angelegt werden muss. Ok danke Neoxx ich schreibe, das Ganze mal um. Und melde mich wieder :wink: VG

Also ja die Schnittstelle rennt ohne Bildaten. Aber selbst der seperate Export der Bilder zu Shopware ist sehr langsam. Vielleicht doch eher über Rsync die Ordner syncen? Aber wie sage ich Shopware dieses Bild gehört zu jenem Artikel? Danke und VG

Wie groß sind denn die einzelnen Bilddatein? (MByte, Auflösung, Format)

Die Bilder sind ca. 3,3 Mb und haben die Maße 1600x1600. Wahrscheinlich zu groß? Danke und VG

von den mByte her ja. Ich würde die Bilder komprimieren. Bei uns haben die Bilder ca. 120-350 kByte bei einer ähnlichen Auflösung. Grüße

[quote=„timmeyy“][quote]frage: warum updatest du die varianten anstatt sie direkt im post mit anzulegen?[/quote] Ich habe mich an die Shopware Dokumentation gehalten und es so verstanden, dass der Hauptartikel zuerst angelegt werden muss. [/quote] Ja, das ist an mancher Stelle mißverständlich bis löchrig geschrieben. Du kannst einen Artikel komplett, mit allen Varianten und Kram importieren :wink:

Oh ok :slight_smile: Naja jetzt wo ich Bilder von Artikeln getrennt habe rennt die Schnittstelle. Aber die Bilder dauern mir echt zu lange. Selbst kompremiert… Wir versuchen es jetzt über rsync und einfach den mediaPath anzugeben… Danke euch !

ja, das sind definitiv die bilder. anghängig von den thumbnails die du definiert hast werden X thumbail-größen neu gerendert (warum man die neu rendert anstatt einfach zu re-sizen, versteh das wer will). das einzige was du machen könntest wäre die dinger vorher hochzuladen und dann nur noch die media-Id verknüpfen, ob das jedoch einen so großen performance-sprung herbeiführt, dass sich der aufwand lohnt, ist mehr als fraglich würde mich dennoch interessieren, also wenn du das machst, lass es uns wissen

Hi, also ich habe per rsync alle Bilder nach Shopware gesynct. Wenn ich richtig verstanden habe ist dafür der /media/temp/ - Ordner der richtige. Wenn ich jetzt einen API-Call mache for($i = 0; $i \< $product['bilder']; $i++) { $imageSrc = $product['artikelnummer'] . '\_' . $i; //if (@getimagesize($imageSrc)) { $imageData[$i] = array('mediaId' =\> $id,'path' =\> $imageSrc, 'extension' =\> 'jpg'); //} } array(3) { ["mediaId"]=\> int(8089) ["path"]=\> string(14) "000002540000\_5" ["extension"]=\> string(3) "jpg" } Also er weiß weder, das physikalische Bild (media/temp) zuzordnen noch bekomme ich am Artikel ein Bild angezeigt. Was meiner Meinung nach total komisch ist, er setzte, wenn ich eine ID angebe die gleich bei mediaId und articleId. Geht das überhaupt? Ich habe in einigen Beiträgen gelesen, dass man zuerst ein Bild anlegen muss wahrscheinlich dann so: for ($i = 0; $i \< $productVariant['bilder']; $i++) { $imageSrc = $productVariant['artikelnummer'] . '\_' . $i . '.jpg'; if (@getimagesize($imageSrc)) { $imageDataVariants[$i] = array('link' =\> $imageSrc); } else { continue; } } Weil dieser weg funktioniert auch, aber es ist einfach zu langsam. Falls hier jemand noch eine Idee hat, wie es über den array-key “path” machen könnte wäre ich dankbar. VG

[quote=“Mogly”]ja, das sind definitiv die bilder. anghängig von den thumbnails die du definiert hast werden X thumbail-größen neu gerendert (warum man die neu rendert anstatt einfach zu re-sizen, versteh das wer will). das einzige was du machen könntest wäre die dinger vorher hochzuladen und dann nur noch die media-Id verknüpfen, ob das jedoch einen so großen performance-sprung herbeiführt, dass sich der aufwand lohnt, ist mehr als fraglich würde mich dennoch interessieren, also wenn du das machst, lass es uns wissen[/quote] Danke für deinen Beitrag, also die Bilder manuell hochladen macht keinen Sinn. Wie beschrieben entweder über den array-key “link” alle Bilder hochladen, was locker an die 8h dauert oder den Weg über rsync, dafür müsste aber die API den angegebenen array-key “path” erkennen. VG