[unpublished]: Produktimport (imivileda)

Posted in Magento, 24.07.2014 18:07

Aufruf 

Der Aufruf erfolgt in <magento>/public mittels:

php -f shell/imi_viledaimport.php import --website spain --prefix ES

damit wird der Import der csv-Datei 

<magento>/public/var/importexport/spain/products.csv 

ausgeführt. 

Es wird automatisch ein DRYRUN durchgeführt. Wenn tatsächlich keine Fehler mehr auftreten kann mit der Option --live der echte Import durchgeführt werden.

Importdatei

Produktdaten liegen als csv vor, Format war durch vileda vorgegeben. Importdateien müssen unter <magento>/public/var/importexport/<country> abgelegt werden. 

Dateiname ist hartcodiert und muß products.csv heißen.

Zugehörige Bilder

werden nur als Namen in der Importdatei referenziert. Sie müssen unter <magento>/public/media/import/<country> abgelegt werden.

<country> entspricht dabei dem CODE der WEBSITE (siehe Magento System>Manage Stores).

Ablauf

imi_viledaimport.php inkludiert imi_abstract.php, was widerum die abstract.php inkludiert. Diese ist eine Magento-Core-Datei (Mage_Shell_Abstract).

Jedes Mag-Shell-Script benötigt eine run-Funktion die dann die Hauptfunktion aufruft. Hier ist das die ProcessImport-Funktion. 

Der Import beruht im Wesentlichen auf einem CSV-Parsing und einem Aufruf des aktuellen Imports. Die Import-Klasse benötigt die Daten in Form eines Arrays, der hier von der buildArray-Methode gebaut wird. Dazu wird ein eigener Importadapter, der den Mage-Standardadapter erweitert aufgerufen und ihm die csv-Datei übergeben:


$adapter = Mage::getModel('imi_viledaimport/import_adapter_csv_vileda', $file);
Der Magento-CSV-Importadapter implementiert und erweitert das SeekableIterator-Interface. 

Durch Überschreiben der current-Methode hat man die Möglichkeit, spezielle Anpassungen für die Ausgabe vorzunehmen.

Der Vileda-Import-Adapter befindet sich hier:

public/app/code/local/IMI/ViledaImport/Model/Import/Adapter/Csv/Vileda.php

Außer daß zwei weiteren Eigenschaften gesetzt werden ist vor allem die current-Methode interessant:


var $_prefix;

var $_website;

Es werden z.B. leere Keys oder Keys, die mit "*" beginnen, entfernt. Das läßt die Möglichkeit zu, eine csv-Datei, die unnötige Export-Spalten enthält, zu verwenden.


foreach($current as $key=>$value) {
 if(substr($key,0,1) == '*') {
 unset($current[$key]);
 continue;
 }
 if ($key == '') {
 unset($current[$key]);
 continue;
 }

Desweiteren werden an die SKUs die Länder-Präfixe, die dem import-Skript als Parameter mitgegeben werden müssen, angehängt.


foreach(array('sku', '_links_upsell_sku', '_links_related_sku', '_links_crosssell_sku', '_super_products_sku') as $sku_attribute_code) {
 if ($current[$sku_attribute_code]) {
 $current[$sku_attribute_code] = $this->getPrefix() . '-' . $current[$sku_attribute_code];
 }
 }

Die Bildpfade werden vervollständigt und weitere Bildattribute gesetzt:


if ($current['_media_image']) {
 $current['_media_image'] = $this->getWebsite() . DS . $current['_media_image'];
 }

if ($current['_media_image']) {
 $current['_media_attribute_id'] = Mage::getSingleton('catalog/product')->getResource()->getAttribute('media_gallery')->getId();
 $current['_media_is_disabled'] = 0;
 $current['_media_position'] = 1;
 }

Wenn kein Preis gesetzt wurde, wird ein Dummy-Preis gesetzt. 

Beachten: die Ausgabe des CSV-Adapters kann nicht direkt für den Import verwendet werden, sondern muß über die PHP-Methode iterator_to_array erst in einen Array umgewandelt werden! Das passiert wieder in der buildArray-Methode des imivileda_import-Skripts.


 return iterator_to_array($adapter);

Für den tatsächlichen Import wird die AvS-FastSimpleImport-Extension für Magento verwendet.


 $import = Mage::getSingleton('fastsimpleimport/import');

Die ist gut dokumentiert: 

http://avstudnitz.github.io/AvS_FastSimpleImport/options.html

Das Objekt wird initialisiert und ein paar Parameter gesetzt (dies kann in der neuen Version auch im Backend gemacht werden) und dann beim Ausführen die Daten übergeben:


 $import = Mage::getSingleton('fastsimpleimport/import');

$import->setDropdownAttributes(array('p_size', 'color'));

$import->setContinueAfterErrors(true);

if ($dryrun) {
 $result = $import->dryrunProductImport($data);
 } else {
 $result = $import->processProductImport($data);
 }

Das war's im Wesentlichen. Alles übrige im Skript betrifft im Grunde die Logger-Ausgaben. 

Wenn der Dryrun fehlerhaft auslief, sah die Loggerausgabe auf der Shell in etwa so aus:


[INFO]: ========================= Init =========================
[INFO]: DRY RUN
[NOTICE]: Import file: /var/www/vileda-shop/public/var/importexport/imivileda/spain/products.csv
[DEBUG]: CSV Loaded
[INFO]: ====================== Pre Check =======================
[WARN]: Pre check: Image file (referenced in Line 83) not found: spain/Escoba Electrica_II.jpg
[WARN]: Pre check: Image file (referenced in Line 173) not found: spain/Guantes Multisensitive_40+10 HR.jpg
[WARN]: Pre check: Image file (referenced in Line 179) not found: spain/Guantes Multisensitive_40+10 HR.jpg
[WARN]: Pre check: Image file (referenced in Line 185) not found: spain/Guantes Multisensitive_40+10 HR.jpg
[WARN]: Pre check: Image file (referenced in Line 187) not found: spain/New packshot_tango_dust_refill.png
[WARN]: Pre check: Image file (referenced in Line 190) not found: spain/Nueva_MopafacilSec.jpg
[WARN]: Pre check: Image file (referenced in Line 192) not found: spain/Rec Rapid Attrac_12 copia.jpg
[WARN]: Pre check: Image file (referenced in Line 195) not found: spain/Rec_Attrac_plus_24+6 copia.jpg
[WARN]: Pre check: Image file (referenced in Line 198) not found: spain/Set_Attrac_Plus.jpg
[WARN]: Pre check: Image file (referenced in Line 200) not found: spain/rec_flexi copia.jpg
[WARN]: Pre check: Image file (referenced in Line 204) not found: spain/Mopa_Flexi.jpg
[WARN]: Pre check: Image file (referenced in Line 215) not found: spain/SF_2en1_sin film.jpg
[WARN]: Pre check: Image file (referenced in Line 220) not found: spain/SF_2en1_sin film.jpg
[WARN]: Pre check: Image file (referenced in Line 226) not found: spain/Suave sin film.jpg
[WARN]: Pre check: Image file (referenced in Line 231) not found: spain/Suave sin film.jpg
[WARN]: Pre check: Image file (referenced in Line 238) not found: spain/1_2_Spray copia.jpg
[WARN]: Pre check: Image file (referenced in Line 251) not found: spain/set_super_nueva.jpg
[WARN]: Pre check: Image file (referenced in Line 260) not found: spain/electro_spinmop_ewc_packshot.jpg
[WARN]: Pre check: Image file (referenced in Line 365) not found: spain/PALOCEPI.jpg
[WARN]: Pre check: Image file (referenced in Line 370) not found: spain/Sujetapalos_triplo Nuevo.jpg
[WARN]: Pre check: Image file (referenced in Line 392) not found: spain/Bayeta Antibacterias x2 HR.jpg
[WARN]: Pre check: Image file (referenced in Line 398) not found: spain/Bayeta Maxi Suave HR.jpg
[WARN]: Pre check: Image file (referenced in Line 422) not found: spain/Bayeta Sin Gota Escurrevajillas.jpg
[WARN]: Pre check: Image file (referenced in Line 521) not found: spain/Aluminio 30 metros HR.jpg
[WARN]: Pre check: Image file (referenced in Line 526) not found: spain/Bolsas One Zip 3litros HR.jpg
[WARN]: Pre check: Image file (referenced in Line 537) not found: spain/Bolsas One Zip 1litros HR.jpg
[INFO]: ======================== Import ========================
Input Data contains 100 corrupt records (from a total of 153)
:::: SKU is empty ::::
In Line(s) 1, 2, 3, 4, 5, 6, 7, 8, 9

:::: Invalid value for 'meta_description'. String is too long, only 256 characters allowed. ::::
In Line(s) 10, 25, 32, 41, 51, 74, 79, 83, 91, 96, 106, 126, 132, 138, 146, 151

:::: Orphan rows that will be skipped due default row errors ::::
In Line(s) 11, 12, 13, 14, 15, 16, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 52, 53, 54, 55, 56, 75, 76, 77, 78, 80, 81, 82, 84, 85, 86, 87, 92, 93, 94, 95, 97, 98, 99, 100, 107, 108, 109, 110, 127, 128, 129, 130, 131, 133, 134, 135, 136, 137, 139, 140, 141, 142, 144, 145, 147, 148, 149, 150, 152, 153

:::: Product Type is invalid or not supported ::::
In Line(s) 143

[INFO]: ================ END - DRYRUN finished. ================