Das Problem mit ImportExport

Der Standard-Import ImportExport von Magento hat die Geschwindigkeit und Zuverlässigkeit von Produktimporten erheblich verbessert. Leider arbeitet er mit einem schwer verständlichen CSV-Format. Dieses Format gleicht dem Versuch, eine XML- in einer CSV-Datei abzubilden.

Unsere Lösung: XmlImport

Deswegen wandeln wir das Format zurück in XML und nennen das zugehörige Modul Magento XmlImport. Es baut auf FastSimpleImport von Andreas von Studnitz auf und wurde mit einfachen Produkten und mehreren Storeviews intensiv getestet. Andere Fälle (konfigurierbare Produkte, Bundels) wurden ebenfalls kurz getestet. Das Modul ist also OpenSource, konstenlos und frei auf Github verfügbar und als ZIP in diesem Blog-Beitrag.

Warum und wie XmlImport nutzen?

Das Modul liefert einen Produktimport „out-of-the-box“: Die Module FastSimpleImport und XmlImport instillieren, im Backend konfigurieren, eine Import-Datei im konfigurierten Verzeichnis ablegen und php shell/xml_import.php eingeben. Keine Quellcode, keine Anpassung der Module. Es gibt drei Fälle, in denen XmlImport nützlich ist:

  1. Sie können das Ausgabeformat für den Produkt-Export des ERP-Entwicklers bestimmen; dann das Modul und das oben beschriebene Format nutzen und das Projekt ist beendet, bevor es begonnen hat
  2. Sie bekommen ein vorgegebenes Format Ihres ERP-Entwicklers und transformieren dieses Format in das XmlImport-Format; wenn Sie Erfahrung in der Transformation von Dateien haben, sollte dies schneller gehen, als ein Import auf der Basis von FastSimpleImport; besonders mit wenig Vorkenntnissen in Magento, denn für dieses Vorgehen brauchen Sie überhaupt keine
  3. Sie können das Modul als Beispiel für eine FastSimpleImport-Einsatz nutzen.

Magento ImportExport

Magento führte mit der Version CE 1.5 bzw. EE 1.10 den Produkt-Import ImportExport ein. Er zeichnet sich durch hohe Geschwindigkeit und Zuverlässigkeit aus. Allerdings wird der Gebrauch dadurch erschwert, dass Inhalte in einer Zeile des CSV-Formats nicht zwangsläufig zusammengehören.

Sku_storeNameDescription_media_image_media
_lable
_category
1234567 DefaultDefault
Description
img1.jpgImage 1Cat A
 deStandardStandard-
Beschreibung
img2.jpgImage 2Cat B
 enDefaultDefault
Description
Img3.jpgImage 3 

In diesem Beispiel gehören „de“, „Standard“ und „Standard-Beschreibung DE“ zum deutschen Storeview. Die Angabe „img1.jpg“ und die dazugehörige Angabe „image 1“ beschreiben hingegen jeden Storeview. Genauso verhält es sich mit den Kategorien Cat A und Cat B. Das Format gleicht dem Versuch, eine XML- in einer CSV-Datei darzustellen. Für Magento-Entwickler mag dies akzeptabel sein – für Entwickler von ERP-Systemen, die die Import-Dateien entwickeln, allerdings nicht. Aus eigener Erfahrung mit unseren Kunden wissen wir, dass ein unverhältnismäßig hoher Aufwand entsteht, Exportdateien in diesem CSV-Format durch den ERP-Entwickler erstellen zu lassen. Mehr Details zu dem Format gibt es beispielsweise unter http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/ .

Umwandeln des Import-Formats

Der Rest des Artikels beschreibt, wie das oben genannte CSV-Format in ein XML-Format umgewandelt wird. Wesentlicher Vorteil des Moduls XmlImport ist, dass die gleichen Informationen auf die gleiche Weise verarbeitet werden, wie im Standard-Import. Sie können lediglich in einem verständlicheren Format bereitgestellt werden. Das Format jedes Produkts setzt sich aus drei Bereichen zusammen: Den Storeview, dem Storeview zugehörige „simple Data“ und dem Storeview nicht zugehörige Daten, sprich „complex Data“:

<products>
 <product>
  <stores>
   ... STORES GO HERE ...
  </stores>
  <simple_data>
   ... SIMPLE DATA GOES HERE ...
  </simple_data>
  <complex_data>
   ... COMPLEX DATA GOES HERE ...
  </complex_data>
 </product>
</products>

Attribute, die in Magento ImportExport mit „_“ beginnen, sind komplex; andere Attribute hingegen sind einfach. „_store“ bildet die einzige Ausnahme: Dieses Attribut wird zweimal benutzt – einmal im Store-Bereich und ein weiteres Mal bei der Zuordnung einfacher Daten zu den Storeviews. Im Store-Bereich werden alle storeviews aufgelistet, die das Produkt benutzt:

<stores>
 <item>de</item>
 <item>en</item>
</stores>

In den einfachen Daten werden Werte den jeweiligen Storeviews zugeordnet. Dabei kommt „default“ als Storeview hinzu. Dieser bildet die Standardwerte ab:

<simple_data>
  <sku><default>1234567</default></sku>
  <Name>
    <default>Default</default>
    <de>Standard</de>
    <en>Default</en>
  </Name>
  <Description>
    <default>Default description</default>
    <de> Standard-Beschreibung</de>
    <en>Default description</en>
  </Description>
</simple_data>

Für sku darf nur ein Wert unter default vorliegen. Anderenfalls würde das System mehrere Produkte erstellen. Die restlichen Attribute ordnen die Werte entweder einem Storeview oder dem default zu. Anmerkung: Attribute, die auf einem Website-Level festgelegt sind, müssen zu einem der Storeviews zugeordnet werden. Dies ist eine Einschränkung aus ImportExport. Der letzte Teil beschreibt die komplexen Dateien:

<complex_data>
  <enum>
    <item>
      <_media_image>img1.jpg</_media_image>
      <_media_lable>Image 1</_media_lable>
    </item>
    <item>
      <_media_image>img2.jpg</_media_image>
      <_media_lable>Image 2</_media_lable>
    </item>
  </enum>
  <enum>
    <item>
      <_category>Cat A</_category>
    </item>
    <item>
      <_category>Cat B</_category>
    </item>
  </enum>
</complex_data>

Die komplexen Dateien bestehen aus Aufzählungen, die enum-tags. Um die Reihenfolge der Attribute beizubehalten, beinhaltet eine Aufzählung nur die Attribute, die zusammengehören. Es ist essentiell, dass img1.jpg mit Image 1 verknüpft ist und nicht mit Image 2. Die Kategorie ist unabhängig von der Reihenfolge der Medien. Deshalb werden die Kategorien in einer anderen Aufzählung dargestellt (es wäre theoretisch möglich auch die Kategorien in der Image-Aufzählung zu platzieren, dabei geht aber Lesbarkeit uns Sinn verloren). Alle Artikel einer Aufzählung müssten die gleichen Attribute beinhalten (weil ImportExport darauf ausgelegt ist, mit einer CSV-Datei zu arbeiten, die die Attribute voraussetzt).

Alternative Module

Das Modul baut auf FastSimpleImport von Andreas von Studnitz auf (zusätzliche Beschreibung hier). FastSimpleImport bietet sich an, wenn man ein vorgegebenes Format einlesen muss. Nachteil ist der höhere Aufwand als bei der Transformation, Vorteil ist ein geschlossenes Modul. Das ImportExport-Modul von Magento selbst ist eine Alternative, wenn man mit dem CSV-Format leben kann. Dies dürfte insbesondere bei sehr einfachen Produkten der Fall sein. Fabrizio Branca stellte mit Aoe_Import ebenfalls eine XML-basierte Lösung vor, die er hier beschreibt. Ein ähnlichen Weg geht Paul Hachmang mit Ho_Import, das auf FastSimpleImport basiert (Beschreibung außerdem hier, allerdings auf Niederländisch). Beide Lösungen arbeiten mit Konfigurationsdateien, können also verschiedene Formate einlesen, sind aber auch komplizierte in der Handhabung. Zusätzlich adressieren Sie andere Probleme, wie Nebenläufigkeit und Speicherlecks.