Als weiterführende Lektüre empfehle ich die Unterlagen zum Vortrag „Anpassen des neuen ImportExport Moduls für eigene Erweiterungen“. Dort ist auch der Import von Konfigurierbaren Produkten und individuellen Optionen beschrieben, die ich daher nicht noch einmal aufführe. Auch geht es um die Erstellung eigener Adapter für andere Dateiformate.
Die ImportExport-Schnittstelle
Das ImportExport-Modul ersetzt das alte Dataflow-Modul, das in älteren Versionen zum Import und Export von Daten eingesetzt wurde. Beide Module ermöglichen ausschließlich den Import und Export von Produkt- und Kundendaten in und aus Textdateien. Beide Module sind sowohl über das Backend als auch innerhalb von eigenen Modulen nutzbar. Der Hauptvorteil des ImportExport-Moduls ist die deutlich gesteigerte Geschwindigkeit. So können nun mehrere hundert Produkte pro Sekunde importiert werden, während es mit dem alten Modul nur wenige Produkte pro Sekunde waren.
Im Magento-Administrationsbereich findet sich die Importmöglichkeit unter System -> Import/Export -> Import.
Die Produktdaten müssen für den Import mit dem ImportExport-Modul in einer vorgegebenen Struktur vorliegen. Im Standard importiert das Modul ausschließlich CSV-Dateien. Mit meinem kleinen Modul FastSimpleImport können mit einem einfachen Funktionsaufruf alternativ PHP-Arrays importiert werden, die im Rahmen eines eigenen Moduls aus beliebigen Datenquellen per PHP generiert werden können. Ein Aufruf sieht dabei wie folgt aus:
Mage::getSingleton('fastsimpleimport/import')->processProductImport($productData);
Details dazu finden sich im zum Modul gehörenden Blogbeitrag.
Die Datenstruktur
Die Daten müssen für den Import in einem vordefinierten Format vorliegen. Für die Beispiele verwende ich hier das CSV-Format aus dem Standard. Die gleichen Strukturen können auch bei anderen Import-Methoden verwendet werden.
Grundsätzlich gilt, dass sich viele Details des Formats daraus erschließen lassen, dass man bestehende Produktdaten exportiert und sich die exportierte CSV-Datei ansieht. Das Format für den Import ist praktisch identisch – es werden im Export allerdings nicht alle Funktionalitäten unterstützt, die im Import existieren, wie z.B. Gruppierte Produkte.
Für CSV ist das Format wie folgt:
-
Spaltennamen in der ersten Zeile
-
Spaltentrenner: Komma
-
Texttrennzeichen: doppelte Anführungszeichen (optional)
- Zeichensatz: UTF-8
Eine Datei für den Import von Basisdaten eines Produktes sieht beispielsweise wie folgt aus:
sku,_type,_attribute_set,_product_websites,name,price,description,short_description,weight,status,visibility,tax_class_id,qty
1234567,simple,Default,base,Default,0.99,Default,Default,0,1,4,2,76
Der besseren Übersicht wegen stelle ich die Daten im Tabellenformat dar:
sku | _type | _attribute_set | _product_websites | name | price | description | short_description | weight | status | visibility | tax_class_id | qty |
1234567 | simple | Default | base | Default | 0.99 | Default | Default | 0 | 1 | 4 | 2 | 76 |
Hier sind nur die Pflichtfelder für neue Produkte aufgeführt. Bei bestehenden Produkten kann auf einzelne Felder auch verzichtet werden – unverzichtbar ist lediglich das Feld sku (Artikelnummer), das der Identifizierung des zu bearbeitenden Produktes dient.
Die Aktualisierung der Lagerbestände von zwei Produkten könnte also wie folgt aussehen:
sku | _type | _attribute_set | _store | qty |
1234567 | 74 | |||
1234568 | 12 |
Grundsätzlich gilt allerdings: Die Spalten _type, _attribute_set und _store müssen auch bei Produktaktualisierungen vorhanden sein, die Felder können aber den Wert null haben, sofern man den bestehenden Wert nicht überschreiben will. Der Übersicht halber lasse ich diese in den folgenden Beispielen weg.
Optionale Attribute (wie z.B. cost oder special_price) können als zusätzliche Spalten einfach angehängt werden. Das gleiche gilt für selbst angelegte Attribute (z.B. color oder manufacturer).
Auswahlfelder
Als Auswahlfelder bezeichne ich Felder, die vorgegebene Werte haben. Beispiele sind status (Aktiviert oder Deaktiviert) oder color (eigene Werte). Während die oben aufgeführten Felder status, visibility und tax_class_id die IDs erwarten, muss man für andere Attribute den Optionstext einfügen:
sku | color | is_imported |
1234567 | red | yes |
1234568 | blue | yes |
Zu beachten ist noch, dass hier die globalen Optionswerte stehen müssen, keine lokalisierten.
Ein Nachteil ist, dass die Schnittstelle nicht in der Lage ist, noch nicht vorhandene Optionen selbst anzulegen. Dies muss also in einem vorgelagerten Schritt passieren.
Mehrsprachigkeit
Für den Import mehrsprachiger Texte muss pro StoreView eine eigene Zeile erstellt werden. Das sieht dann z.B. wie folgt aus:
sku | _store | name | Description |
1234567 | Standard | Standard-Beschreibung | |
de | Standard | Standard-Beschreibung deutsch | |
en | Default | Default Description |
In der Spalte _store wird dabei der Code des StoreViews eingetragen.
Wichtig ist hier, dass das Feld sku nur in der jeweils ersten zum Produkt gehörigen Zeile angegeben wird. Alle weiteren werden automatisch dem gleichen Produkt zugeordnet. Dieser Mechanismus wird auch für andere Felder, die mehrere Werte haben können, verwendet. Diese führe ich im Folgenden auf.
Mehrere Websites
Auch mehrere Websites werden in mehreren Zeilen angegeben:
sku | _product_websites |
1234567 | website_code_1 |
website_code_2 |
Kategorien
Für Kategorien werden die Namen (Standardwerte) verwendet, mit komplettem Pfad, getrennt durch Schrägstriche. Das sieht beispielsweise wie folgt aus:
sku | _category |
1234567 | Electronics/Cameras/Digital Cameras |
Apparel/Shoes/Mens |
Auch hier werden mehrere Einträge in eigene Zeilen geschrieben.
Staffelpreise
Für Staffelpreise gibt es eine Reihe spezieller Felder, die man befüllen kann. Den Import von Staffelpreisen kann man am einfachsten anhand eines Beispiels erläutern:
sku | _tier_price_website | _tier_price_customer_group | _tier_price_qty | _tier_price_price |
1234567 | all | 1 | 10 | 0.89 |
all | 1 | 20 | 0.79 | |
all | 2 | 10 | 0.85 | |
all | 2 | 20 | 0.70 | |
1234568 | website_code_1 | all | 10 | 16.50 |
„all“ ist hierbei der Standardwert für „Alle Websites“ bzw. „Alle Kundengruppen“.
Produktbilder
Der Import von Produktbildern ist erst seit der Magento-Version 1.6 (CE) bzw. 1.11 möglich. Die zu importierenden Bilder müssen im Verzeichnis media/import liegen. Der entsprechende Teil der Importdatei muss wie folgt aussehen:
sku | _media_image | _media _attribute_id | _media _is_disabled | _media _position | _media _lable | image | small _image | thumbnail |
1234567 | img1.jpg | 77 | 1 | 1 | Bild 1 | img1.jpg | img2.jpg | img2.jpg |
img2.jpg | 77 | 0 | 2 | Bild 2 | ||||
Img3.jpg | 77 | 0 | 3 | Bild 3 |
Einige Erläuterungen hierzu:
-
Unter _media_image wird der Dateiname des zu importierenden Bildes eingetragen
-
Die _media_attribute_id ist die ID des Produktattributes „image_gallery“ einzutragen. Man erhält sie entweder über den Administrationsbereich oder in eigenen Modulen über den folgenden Ausdruck:
Mage::getSingleton('catalog/product')->getResource()->getAttribute('media_gallery')
->getAttributeId(); -
Der Schreibfehler bei _media_lable ist beabsichtigt und in Magento eingebaut
-
Bei image, small_image und thumbnail werden in der ersten Zeile die Dateinamen der entsprechenden Hauptbilder eingetragen.
-
Vorhandene Bilder können leider über das Modul nicht gelöscht werden.
Up-Selling, Cross-Selling, Ähnliche Produkte
Auch Produktverknüpfungen können importiert werden. Hierfür gibt es jeweils zwei Felder:
-
_links_related_sku und _links_related_position
-
_links_crosssell_sku und _links_crosssell_position
- _links_upsell_sku und _links_upsell_position
Das sieht wie folgt aus:
sku | _links_upsell_sku | _links_upsell_position | _links_crosssell_sku | _links_crosssell_position |
1234567 | 1234568 | 1 | 1234569 | 1 |
1234569 | 2 |
Gruppierte Produkte
Gruppierte Produkte können ebenfalls importiert werden. Sollen jetzt dem gruppierten Produkt zwei Unterprodukte zugewiesen werden, sieht das wie folgt aus:sku | _type | _associated_sku | _associated_position | _associated_default_qty |
1234567 | grouped | 1234568 | 1 | 1 |
1234569 | 2 | 1 |
Entgegen der Funktionalität im Administrationsbereich von Magento lassen sich so auch Produkttypen im Nachhinein verändern.
Konfigurierbare Produkte und Individuelle Optionen
Auch diese Funktionen werden unterstützt. Da Vinai diese in seinem Vortrag jedoch bereits ausführlich vorgestellt hat, verweise ich hier auf seine Vortragsunterlagen.
Indizierung
Zu beachten ist, dass beim Import mit dem ImportExport-Modul die Indizes nicht aktualisiert werden. Sie werden hingegen als invalide markiert und müssen anschließend über den Administrationsbereich bzw. ein eigenes Modul aktualisiert werden.
Fazit
Das ImportExport-Modul ist ein wichtiger Fortschritt für Magento, da es endlich im Standard das schnelle und zuverlässige Importieren von Produkten ermöglicht. Ich persönliche mache alle Produktimporte (und Kundendatenimporte) mittlerweile ausschließlich über dieses Modul, da es viele Funktionalitäten bereits von Haus aus bereitstellt und (v.a. mit Hilfe meines kleinen Moduls FastSimpleImport) auch recht einfach zu bedienen ist. Über manche kleine Schwachstelle oder Unschönheit muss man dabei hinwegsehen.
Ich hoffe, mit diesem Beitrag einen Beitrag zum besseren Verständnis und zur besseren Bedienbarkeit des Moduls beigetragen zu haben.