Kurzinfo


Andreas von Studnitz

  • Diplom-Informatiker
  • 6 Jahre Entwicklungs- und Projektleitungserfahrung in einer Internet-Agentur
  • Magento-Freelancer
  • auch TYPO3, PHP, SQL
  • JavaScript, jQuery, Prototype, AJAX

mehr »

Kontakt

Telefon:
0241 912 75 912 oder
0170 486 0 464

E-Mail:
avs(at)avs-webentwicklung.de 

Twitter: twitter.com/avstudnitz

mehr »

< Magento: Fehler beim Index-Aufbau - Sofortmaßnahmen

Magento: Import mit der neuen, schnellen Import-Schnittstelle für Produkte und Kunden

19.09.2011 21:52

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.

 

Download bei GitHub

Kommentare

Andre , 23.09.11 13:20:
Danke für's Teilen. Ich habe den Link zu diesem Post gleich mal an den Magento-Geek bei uns im Betrieb weitergeschickt :)
Nicolas , 28.11.11 12:34:
Auch von mir ein herzliches "Dankeschön"! Dank deiner Erweiterung habe ich es recht schnell geschafft ein externes Skript zu basteln, welches eine XML-Schnittstelle unseres Lieferanten anspricht und die Produktdaten per Array an die Import-Schnittstelle übergibt. Hätte ich sonst nie so schnell hinbekommen (bin Magento-Newbie). Nun habe ich allerdings das Problem, dass es offenbar ein Memory Leak gibt - nach gut 50 importierten Artikel hat sich der verwendete Arbeitsspeicher auf über 100mb erhöht. Kannst du mir vielleicht verraten, wie ich den Speicher freigeben kann? Wäre wirklich sehr nett, bin da etwas hilflos...
Nicolas , 01.12.11 15:11:
Ich konnte das Problem übrigens umgehen, in dem ich bei jedem Aufruf von "processCustomerImport" 100 oder mehr Artikel importiere (alles andere macht Performance-technisch auch keinen Sinn). Das Memory Leak bleibt natürlich bestehen, bereitet dann jedoch erst nach einigen Tausend Artikeln Probleme...
André , 05.12.11 15:07:
auch von mir ein herzliches Dankeschön für das schöne Tutorial. Ich hoffe gegen eine Verlinkung hast du nichts?

Freundliche Grüße
Andreas von Studnitz, 07.12.11 11:49:
Nein, ich habe keine Probleme mit Verlinkungen :-)
Andreas von Studnitz, 19.12.11 11:58:
Eine ausführliche Beschreibung der Standardfunktionalitäten habe ich unter http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/ verfasst. Darin: Import von Mehrsprachigkeit, Kategorien, Staffelpreisen, Produktbildern, Produktverknüpfungen und Gruppierten Produkten.

Kommentar hinzufügen

* - Pflichtfeld

*




*