CuteSave - Schnell über die Magento Api importieren

Auf dem Fodcamp kam die Idee einen schnellen Importer zu bauen. Dabei war der erste Einfall das Model catalog/product in das Format des Import/Export zu konvertieren. In meinem ersten GitHub-Fork gehe ich jetzt einen ähnlichen Weg mit dem Ziel die SOAP-API zu optimieren.

Der Name Cutesave stammt eigentlich vom Begriff Queued und Save. Zu deutsch: Schlange stehen beim Speichern.  Und genau hier ist der Trick: Beim Speichern eines Produktes müssen viele Tabellen Stück für Stück befüllt werden. Das ist in der Regel über die aktuellen Resource-Models nicht sonderlich schnell. Der Import/Export von Magento fast diese Anfragen zusammen und pumpt so innerhalb von 10 Sekunden ca. 1000 Produkte in die Datenbank. Auf optimieren Server-Kisten natürlich noch viel mehr.

Genau so funktioniert unsere Importer-Api auch. Jeder Aufruf schreibt das Produkt-Array zunächst in eine lokale Queue in der Session und beim Aufruf von write erst in die Datenbank. Zusätzlich bin ich dabei auch Bild-Übertragungen etc. zu optimieren um eine möglichst gute API zu schaffen.

Ein paar Beispiele

$client = new SoapClient('http://localhost.magento/magento161/api/soap?wsdl');

Jetzt holen wir uns ein Vorlage-Array für Produkte

$basicattributes = $client->call( $session, 'fodcamp_cutesave_product.getbasicattributes');

Mit den Basic-Attributes wissen wir welche Felder Magento haben möchte, diese befüllen wir jetzt logisch

$new_product['sku'] = '1234';
$new_product['name'] = 'Promidata-Test';
$new_product['price'] = '9.95';
$new_product['status'] = '1'; // 1 = Enabled, 0 = Disabled
$new_product['description'] = 'Ich bin ein langer Text';
$new_product['short_description'] = 'Kurzbeschreibung';
$new_product['categories'] = array( 'Kategorie1' );

Wenn wir ganz viele Produkte hinzufügen ist es aber gute Idee viele Soap-Request zu machen. Dazu gibt es in Magento Multi-Calls:

$calls = array();

for($i=0; $i<5; $i++) {

    $multi_new_product = $new_product; // Wenn nehmen das new_product von oben als Vorlage
    $multi_new_product['sku'] = 'test-sku'.$i; // Und ändern nur die Artikel-Nr :)

    $calls[] = array('fodcamp_cutesave_product.addsimple', array( $multi_new_product) );

}
$client->multiCall( $session, $calls );

Das müssen wir nun noch alles in die Datenbank schreiben

print_r( $client->call($session, 'fodcamp_cutesave_product.write' ) );

Ganz am Ende müssen wir noch die Indizes aktualisieren

$client->call($session, 'fodcamp_cutesave_product.reindex' );

Quellcode?

Natürlich gibt es den Quelltext dazu auf Github.



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
Tobias Vogt am

Hallo Thorsten,

CuteSave ist leider weiterhin eine absolute Alpha-Version und wurde von mir nicht weiter entwickelt, sorry!

Liebe Grüße

Tobi

Thorsten am

Hallo! Da ich Probleme bei der Inbetriebnahme des scripts habe, habe ich nun eine frische Magento-Installation 1.6.2 hergenommen und das aktuelle cutesave-Module (von github) installiert. Dennoch: Das Test-Script habe ich mit den aktuellen api-Zugangsdaten geändert und erhalte auch eine session. Nur dann kommt ein invalid api path... und ich kann mir nicht vorstellen, warum? Alle Suche war bisher erfolglos. Auf die core-Api-Funktionen z.B. catalog_product.list kann ich zugreifen. Bei einem einfachen Zugriff mit dem Call "fod_cutesave_product.getbasicattributes" oder "fod_cutesave_product.getWebsites" kommt "invalide api path". Irgendeine Idee?

Thorsten

Das habe ich bei der soaptest.php gemacht: Die soaptest.php am Anfang um die Freischaltung des Fehlerreports ergänzen und nach der Erzeugung der Session die Session-ID ausgeben...

gammacode am

ahh wurde noch nciht freigeschalten - ok thx ... bis dahin ...

gammacode am

hi warum wird mein kommentar hier raus gelöscht ?

gammacode am

das script ist gut. leider können damit keine group_price anegsteuert werden.

ich habe das auf einen andere wege initiiert mittels

_group_price_website _group_price_customer_group _group_price_price

group preis erhält ein array, aber leider nicht die richtigen values, sind alles null values - warum auch immer - muss ich mal xdebug einsetzen um auf die schliche zu kommen

danke für euren bisherigen ensatz :) , wenn ich emhr weiß poste ich die lösung !

Markus Gruber am

hat sich erledigt. In der Methode _initCategoies() wird der Wert zerlegt. Angabe also:

$new_product['categories'] = array( 'import/importsub' );

Markus Gruber am

Teste gerade dein Skript mit 80 000 Artikel. Die Geschwindigkeit ist ganz i.O.. Kann man eigentlich auch Sub-Kategorien angeben?

Tobias Vogt am

aber danke für den Hinweis !

Tobias Vogt am

hat jedoch leider ein ähnliches Problem wie CuteSave : es fehlt eine gut funkionierene wsdl die auch mit .net oder Java keine Probleme macht ...

Steven Fritzsche am

https://github.com/danslo/ApiImport

Ähnliche Idee. Scheint sogar ein wenig umfangreicher zu sein.

Gruß Steven

Tobias Vogt am

Wir testen gerade mit 1.6.1 - mit 1.4 kann das leider noch nicht laufen. Hier gibt es das Import/Export-Model von Magento noch nicht.

Mit 1.5 müsste man es aber auch lauffähig bekommen :)

Thorsten am

Hallo - das klingt gut. Welche Magento-Version ist Mindestvoraussetzung? Oder anders herum - klappt das auch mit 1.4.1.1?

Danke für das Skript. Gruß, Thorsten

Tobias Vogt am

Naja.. unsere Idee war ja das Model zu konvertieren. Das wollte ich jetzt nicht alles löschen deswegen hab ich nen Fork gemacht :) Aber wir können wenn ich weitergekommen bin gerne über eine Rückführung sprechen!

daim am

Nur wozu dann ein Fork?

Dein Kommentar