Neueste Blog-Einträge
Kurzinfo

Andreas von Studnitz
- Diplom-Informatiker
- 6 Jahre Entwicklungs- und Projektleitungserfahrung in einer Internet-Agentur
- Magento-Freelancer
- Magento Certified Developer
- 4 Jahre Magento-Erfahrung
Magento: Import mit der neuen, schnellen Import-Schnittstelle für Produkte und Kunden
Die seit Magento CE 1.5 verfügbare neue Importfunktion beschleunigt den Import von Produkten und Kundendaten deutlich. Aber wie kann man den neuen Import eigentlich in eigenen Modulen einsetzen?
Seit der Magento-Version 1.5 (Community Edition) bzw. 1.10 (Enterprise und Professional Edition) gibt es ein neues Schnittstellen-Modul namens ImportExport. Dieses importiert und exportiert Produkte und Kundendaten. Während der alte Import kaum über eine Geschwindigkeit von wenigen Produkten pro Sekunde hinaus kommt, sind mit dem neuen Modul auch mehrere hundert Produkte pro Sekunde machbar (siehe z.B. der Beitrag von Roman Zenner).
Über die Admin-Oberfläche sind die Funktionen zum Import und Export über System -> Import/Export zugänglich und relativ intuitiv bedienbar. Für einen regelmäßigen Import sollte die Schnittstelle jedoch über ein Modul bedienbar sein.
In seinen Vorträgen bei der Magento Imagine 2011 und bei Meet Magento #5.11 hat Vinai Kopp sehr ausführlich die Verwendung des Moduls mit eigenen Import-Adaptern präsentiert. Wer sich näher mit der Technik beschäftigen möchte, sollte sich auf jeden Fall das Video des Vortrags in Leipzig (drittletzter Vortrag auf der Seite) ansehen.
Das ImportExport-Modul hat im Standard-Funktionsumfang jedoch einen großen Nachteil: es erwartet eine Datei zum Import. Möchte man stattdessen Inhalte aus einer Datenbank, einem Webservice oder einer anderen Schnittstelle verwenden, muss ein alternativer Source-Adapter implementiert werden.
Leider ist das nicht so einfach wie gewünscht, da sich die entsprechende Basis-Klasse nicht einfach wie gewünscht ableiten lässt, dank der "schönen" folgenden Klassendeklaration:
abstract class Mage_ImportExport_Model_Import_Adapter_Abstract
implements SeekableIterator
{
final public function __construct($source)
{...}
...
}
Diese Klasse ist die Basis für eigene Source-Adapter, die definieren, wo die Daten herkommen und in welcher Form sie vorliegen. An anderer Stelle wird ein Objekt der Klasse Mage_ImportExport_Model_Import_Adapter_Abstract als Source-Adapter erwartet.
Es sind also weitere Änderungen notwendig. Damit nicht jeder Entwickler sich in die Materie einarbeiten muss, habe ich ein kleines Modul entwickelt, das sich bei Github herunterladen lässt. Es beruht darauf, dass die Daten als Array vorliegen - in ein Array kann man eigentlich immer beliebige Daten konvertieren.
Das Modul lässt sich in einem eigenen Modul beispielsweise wie folgt nutzen, nachdem mein Modul installiert wurde:
$data = array(
array(
'sku' => '1234567',
'_type' => 'simple',
'_attribute_set' => 'Default',
'_product_websites' => 'base',
'name' => 'Default',
'price' => 0.99,
'description' => 'Default',
'short_description' => 'Default',
'weight' => 0,
'status' => 1,
'visibility' => 4,
'tax_class_id' => 2,
'qty' => 76,
),
);
Mage::getSingleton('fastsimpleimport/import')
->processProductImport($data);
Die einzelnen Elemente des übergebenen Arrays repräsentieren dabei jeweils ein Produkt bzw. eine Ausprägung eines Produktes. Werden mehrere Elemente im äußeren Array übergeben, werden mehrere Produkte bzw. Ausprägungen eines Produktes angelegt bzw. angepasst.
Im Beispiel sind alle Pflichtfelder angegeben. Weitere mögliche Felder sind z.B. alle Attributcodes. Es ist aber auch möglich, z.B. Inhalte für bestimmte StoreViews, Varienten von konfigurierbaren Produkte oder Staffelpreise anzugeben, hierfür werden jeweils weitere Zeilen pro Produkt verwendet. Wichtig ist hierbei, dass der Array-Index 'sku' existiert, er muss aber keinen Wert beinhalten.
Die möglichen Varianten kann man leicht herausfinden, indem man ein Produkt wie gewünscht im Magento-Backend anlegt und anschließend exportiert. Den Aufbau der resultierenden CSV-Datei kann man in das zu importierende Array 1:1 übernehmen.
Der Import von Kundendaten läuft analog. Der nötige Befehl lautet
Mage::getSingleton('fastsimpleimport/import')
->processCustomerImport($data);
Der Hauptschlüssel ist das Feld "email" statt "sku". Weitere notwendige Felder lassen sich durch ausprobieren herausfinden (das Modul wirft eine entsprechende Exception) oder durch die Analyse einer Export-Datei.

Freundliche Grüße
ich mag ja Arrays und daher habe ich mich sehr gerne Deines Moduls bedient und soeben ein ziemlich verschränktes Array mit Zubehör und Up-Selling und mehreren Kategorien an Dein Modul übergeben - und es wird tadellos importiert.
Bis nachösterlich zum Stammtisch!
ich hatte gerade ein Performance-Problem mit deinem ArrayAdapter und großen Datenmengen (ca. 70.000 Datensätze). Die getColNames() Funktion ist aufgrund der vielen Aufrufe von array_merge() extrem langsam gewesen. Ich habe sie etwas umgeschrieben, so dass sie nun wesentlich schneller läuft:
public function getColNames()
{
$colNames = array();
foreach($this->_array as $row) {
foreach (array_keys($row) as $key) {
if (!is_numeric($key) && !isset($colNames[$key])) {
$colNames[$key] = $key;
}
}
}
return $colNames;
}
Vielleicht magst du dir das ja mal anschauen? Ich denke auch, dass man an dieser Stelle auch noch sauberer Arbeiten kann.
Ich habe den app-Ordner in den Magento app-Ordner kopiert.
Und dann eine Php-Datei im Hauptverzeichnis erstellt. Zum Schluss die app/Mage.php includet.
Wo liegt der Fehler?
hier würde ich gern die komplette Datei sehen.
Ich habe eine Beispieldatei unter https://github.com/avstudnitz/AvS_FastSimpleImport/blob/master/test.php bereitgestellt - soll diese im Hauptverzeichnis liegen, muss nur der Pfad zur Mage.php angepasst werden.
Nur bekomme ich es nicht hin unterschiedliche Produktmengen zu importieren. Er nimmt immer die Menge des ersten Produktes. Habe das ganze auch mal mit einem aus zwei Produkten bestehendem Testarray ausprobiert, mit dem selben Ergebnis. Hast du vielleicht eine Idee warum dies passiert?
wie die CSV-Datei bzw. das Array aufgebaut sein muss, um Kategorieverknüpfungen zu importieren, habe ich unter http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/ im Kapitel "Kategorien" beschrieben.
zunächst einmal vielen Dank für deine hervorragende Arbeit! Ich hab jetzt allerdings ein Problem mit einem eigenen Attribut. Ich habe ein Ja/Nein-Attribut im Attributset angelegt, welches ich nun mittels Import befüllen will. Wenn ich das Feld nun mit einer 1 für Ja füllen will, bekomme ich eine Fehlermeldung:
Invalid value for 'attribut_test'
Wenn ich versuche es statt einem Integer mit einem Boolean (true) versuche zu befüllen funktioniert dies aber ebenfalls nicht. Was muss ich denn in dem Array hinterlegen, damit der Import das schluckt?
Gruss Päddl
versuch es doch mal mit "Yes" oder "Ja".
Hat man die Config vorher nicht gesetzt bekommt man "Service Temporarily Unavailable" und muss "maintenance.flag" löschen damit der Shop wieder geht.
Den Kommentar verstehe ich nicht. Zur Installation reicht es normalerweise aus, die Dateien einzuspielen und evtl. den Cache zu leeren.
Ich habe eine XML welche ich in ein Array umwandel, dieses Array schicke ich dann an dein Modul hier, funktioniert super, nur sobald die Beschreibung z.B. mehrzeilig ist bleibt die Beschreibung in Magento einfach komplett leer. Jemand ne Idee?
Hier ein Beispiel:
GEHT:: [name] => Container Container mit 105 % Vollauszug und Soft Einzug Formulareinsatz 10 x DIN A4 X705
GEHT NICHT:: [name] => Container Container mit 105 % Vollauszug und Soft Einzug Querunterteilung 1 Stück für 43,3 cm X47545
Bei mir ist der Import jedoch nicht so schnell wie im Video. Statt der 100'000 in 12 Minuten schafft er eher so 200 in 12 min. Liegt vielleicht an der Layered Navigation die mit mehreren Eigenschaften nutze.
Neue Problem: Ich hätte gerne eine Mindestbestellmenge pro Artikel. Dazu setze ich:
use_config_min_sale_qty = 0
min_sale_qty = $value
Mir scheint dabei wird der erste Wert von min_sale_qty und use_config_min_sale_qty für alle Artikel verwendet. Ich hab leider noch nicht rausgefunden ob das am Plugin oder am Import selbst liegt.
Mage_ImportExport_Model_Import_Entity_Product::_saveStockItem(), $row initialisieren:
$row = array();
$row['product_id'] = $this->_newSku[$rowData[self::COL_SKU]]['entity_id'];
$row['stock_id'] = 1;
das müsstest du in einem vorgelagerten Schritt selbst tun. Seit Kurzem unterstützt der Import auch Kategorien, eine kurze Beschreibung mit Beispiel dazu findest du unter https://github.com/avstudnitz/AvS_FastSimpleImport#features.
Kann ich mit deiner Schnittstelle auch Kategorien Updaten?
tolles script! gibt es eine möglichkeit mehr als ein produktbild zu importieren?
danke und gruss
anreas