CuteSave – Schnell über die Magento Api importieren

14.11.2011   //   von Tobias Vogt   //   Entwicklung, Magento  //  14 Kommentare

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.

Der Autor

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Beschäftigt ist er bei der code-x GmbH, einer Agentur für Internet und Marketing aus Paderborn. 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.

14 Kommentare

  • Nur wozu dann ein Fork?

  • 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!

  • 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

  • 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 :)

  • https://github.com/danslo/ApiImport

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

    Gruß Steven

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

  • aber danke für den Hinweis !

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

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

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

  • 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 !

  • hi warum wird mein kommentar hier raus gelöscht ?

  • ahh wurde noch nciht freigeschalten – ok thx … bis dahin …

  • 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…

  • Hallo Thorsten,

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

    Liebe Grüße

    Tobi

Kommentar schreiben

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.