Magento Produkt Import per Cron Job
Bei der Entwicklung von Magento-Onlineshops entsteht häufig der Bedarf nach einem Import von Produktdaten aus einem anderen System, so auch bei dem von uns entwickelten E-Book-Shop. Neue oder aktualisierte Produkte sollen in regelmäßigen Abständen, z.B. täglich, vollautomatisch in Magento eingespielt werden.
Im Magento-Forum-Beitrag Importing products - using a cron job to call Magento Dataflow import ist bereits beschrieben, wie das im Ansatz funktioniert. Will man jedoch die vom Magento-Gerüst bereitgestellte interne Cron-Job-Funktionalität nutzen, muss man einen Schritt weiter gehen:
Wir haben eine Import-Extension entwickelt, die sich diese Funktionalität zu nutze macht und die in der Magento-Administration konfiguriert werden kann.
Grundstock unserer Extension ist ein neuer Ordner unter app/code/local/Unsere/Extension/ mit folgenden Unterordnern: Convert, etc, Helper, Model
Damit die Extension von Magento erkannt wird muss natürlich unter app/etc/modules/ eine Datei Unsere.xml erstellt werden. Wie so eine Datei aussehen muss kann z.B. hier nachgelesen werden.
Im Ordner app/code/local/Unsere/Extension/Convert/Adapter/ befindet sich die Datei Product.php. Die dort enthaltene Klasse überschreibt die entsprechende Klasse in app/code/core/Mage/Catalog/Model/Convert/Adapter/Product.php. Auf diesem Wege können wir den tatsächlichen Import, also das Setzen und Speichern der Produktdaten, nach Gusto beeinflussen, ohne ansonsten die Importmaschinerie von Magento zu stören. Hier wird zum Beispiel die Verbindung zu einem Digital Rights Management Modul aufgebaut und überprüft, ob die aus der CSV-Datei importierten Ebooks auch tatsächlich verfügbar sind. Abhängig davon wird ihr Status auf 'Aktiviert' oder 'Deaktiviert' gesetzt. Es sind natürlich viele andere Maßarbeiten denkbar, die an dieser Stelle vorgenommen werden können.
Im Ordner etc befinden sich die Dateien config.xml und system.xml, wobei erstere alle Extension-spezifischen Einstellungen enthält und letztere für die Verwaltung der Einstellungen über die Admin benötigt wird.
Im Ordner Helper befindet sich lediglich die leere Klasse Unsere_Extension_Helper_Data, die jedoch für die reibungslose Funktion der Extension vorhanden sein muss.
Im Ordner Model befindet sich die Datei Observer.php mit der Klasse 'Unsere_Extension_Model_Observer', deren Funktion import() von dem Magento-Cron-Job-Mechanismus aufgerufen wird. Die Daten hierfür stehen ebenfalls in der config.xml (Ausschnitt):
Hier wird also jede Nacht um 3:30 die Mehtode import() aus der Klasse extension/observer aufgerufen. Dazu, wie das Verarbeitungsinterval in schedule/cron_expr eingestellt wird, finden sich im Internet unter dem Begriff crontab zahlreiche Erklärungen, z.B. bei Wikipedia.
In der Observer-Klasse werden die Daten aus der Admin-Konfiguration mit Aufrufen wie dem folgenden geladen:
Anschließend werden alle zu importierenden Dateien nacheinander abgearbeitet, wobei nach jeder Datei mit dem Aufruf $batchImportModel->deleteCollection(); dafür gesorgt wird, dass keine Datensätze mehrfach abgearbeitet werden.
Es empfiehlt sich, im Zuge der Importprozedur ausführliche Meldungen in eine Log-Datei zu schreiben und außerdem eine Zusammenfassungs-E-Mail zu generieren, um über den Import-Erfolg auf dem Laufenden zu sein.
Nach einer gründlichen Testphase haben wir nun ein System online gestellt, das uns die komplette Arbeit des Imports abnimmt, flexibel konfigurierbar ist und uns mit einer täglichen, knappen Status-Mail versorgt.
Für die Interessierten, hier der (gekürzte) Code der Observer.php: