Verbesserung REST API für Image bei Variants

Hallo zusammen. Ich hätte einen Vorschlag zu machen um die gewünschten Bilder bei Varianten effektiver uploaden und zu verlinken zu können. Wo kann ich meinen Vorschlag einreichen? Gibt es eine Möglichkeit solche Verbesserungsvorschläge an die Entwickler von Shopware weiterzugeben? Ich lege meine Artikel und Varianten über den Artikel Endpunkt an. Wenn ich mehrere Varianten in derselben Artikel Struktur übergebe, dann möchte ich auch gleich die Images zuordnen können und gebe diese auch mittels „link“ mit. Das Problem: Gewisse Varianten haben dasselbe Bild andere nicht. Wenn ich jetzt bei jeder Variante ein Bild mit denselben „link“ mitgebe so wird das gleiche Bild auch mehrfachweise in der Medien DB angelegt, was nicht nötig wäre. z.B. der folgende Call legt dasselbe Bild lg_CTMTHLOGX_1.jpg 4 mal an {"id":5,"name":"T-Shirt","mainDetail":{"id":12,"images":[{"link":"http://xxxx/Bilder/Modell/7191/Artikel/33954/lg\_CTMTHLOGX\_1.jpg"}],"configuratorOptions":[{"name":"S","group":"Gr[0xc3][0xb6]sse","option":"S"},{"name":"Black","group":"Farbe","option":"Black"}]}, ... "details": [{"articleId":5,..."images":[{"link":"http://xxx/Bilder/Modell/7191/Artikel/33954/lg\_CTMTHLOGX\_1.jpg"}],... {"articleId":5,... "images":[{"link":"http://xxx/Bilder/Modell/7191/Artikel/33954/lg\_CTMTHLOGX\_1.jpg"}],... {"articleId":5,... "images":[{"link":"http://xxx/Bilder/Modell/7191/Artikel/33954/lg\_CTMTHLOGX\_1.jpg"}],... Um das Problem zu umgehen schlage ich eine simples Caching der „link“ im Request vor. Das kann einfach mittels einer einfachen Member Variable in der Resource „Variant“ erreicht werden. class Variant extends Resource implements BatchInterface { var $imageCache = array(); ... Beim anlegen der Bilder kann es dann entsprechend geprüft und zwischengespeichert werden: protected function prepareImageAssociation($data, ArticleModel $article, Detail $variant) ... elseif (isset($imageData['link'])) { $image = null; if(empty($this-\>imageCache[$imageData['link']])) { //check if an url passed and upload the passed image url and create a new article image. $media = $this-\>getMediaResource()-\>internalCreateMediaByFileLink( $imageData['link'] ); $image = $this-\>getArticleResource()-\>createNewArticleImage( $article, $media ); $this-\>imageCache[$imageData['link']] = $image; } else { $image = $this-\>imageCache[$imageData['link']]; } } else { throw new ApiException\CustomValidationException("One of the passed variant images doesn't contains a mediaId or link property!"); } In der Resource „Article“ muss entsprechend dann darauf geachtet werden, dass die Varianten Resource beim Iterieren über die Varianten nicht immer neu angelegt wird. protected function prepareVariants($data, ArticleModel $article) ... $variantResource = $this-\>getVariantResource(); foreach ($data['variants'] as $variantData) { if (isset($variantData['id'])) { $variant = $variantResource-\>internalUpdate( $variantData['id'], $variantData, $article ); ... Diese kleine Modifizerung hat mir einiges gebracht. Die Varianten-erzeugung erfolgt so wesentlich schneller und es werden nicht „massenweise“ dieselben Bilder angelegt. Man kann so alles in einem Webservice Call erreichen statt die Bilder im nachhinein zuweisen zu müssen bzw. in separaten Calls modifizieren zu müssen. Ich würde es begrüssen diese Änderung in einer der zukünftigen Shopware Versionen zu sehen.

die Erweiterung macht Sinn! Du kannst ein Ticket aufmachen und hoffen das Shopware reagiert und sich das anschaut. Du kannst auch bei github den Vorschlag bringen. Da weiß ich aber nicht, wie du da direkt Gehör findest. Zum Thema: ich habe es bisher so gemacht, um doppelte Bilder zu vermeiden. Bilder erst unique in den Mediamanager importiert, dann die Dateinamen und MediaID’s extrahiert und dann die Artikel mit MediaID Verknüfpung importiert. Dein Code würde einiges erleichtern.

Danke, habe ein Ticket eröffnet. Bitte votet für dieses (Link öffnen, einloggen und auf “Votes” klicken) https://issues.shopware.com/#/issues/SW-13625 Merci

Hallo,

das finde ich totel klasse. Kannst du mir sagen wie ich das dezeit bei mir im Projekt anwenden kann? Wo genau müssen die Klassen/Funktionen erstellt werden?

Vielen Dank :slight_smile: