Shopware 4.2 – REST API und so seine Probleme

Mit Shopware 4.2 wurde an viele Features aber auch an den vorhandenen Baustellen geschraubt. Über die Shopware Version 4.2 hatte ich erst letztens geschrieben. In Ankündigung der neuen Version wurde die neue und performantere REST API hervorgehoben. Wer Probleme beim Bildermapping hat sollte jetzt genau lesen.

Bildermapping in Shopware 4.2

Das Bildermapping von Varianten Artikeln ist jetzt viel einfacher und komfortabler geworden. Im Grunde muss nur ein ConfiguratorSet erstellt werden. Dieses beinhaltet die Werte der möglichen Varianten auf diese dann ein Bild gemappt/zugewiesen werden kann.

Der Guide zur neuen Rest API zeigt uns dies ausführlich.

 
array(
    'name' => 'Testartikel',
    'images' => array(
        array(
            'mediaId' => 236,
            'options' => array(
                array(
                    array('name' => '0,5 Liter'),
                    array('name' => 'rot')
                ),
                array(
                    array('name' => 'blau')
                )
            ),
        ),
    ),
    'configuratorSet' => array(
        'name' => 'Test-Set',
        'groups' => array(
            array(
                'id' => 5,
                'name' => 'Flascheninhalt',
                'options' => array(
                    array('id' => 11,'name' => '0,2 Liter'),
                    array('id' => 35,'name' => '0,5 Liter'),
                    array('id' => 12,'name' => '0,7 Liter'),
                    array('id' => 32,'name' => '1,0 Liter'),
                ),
            ),
            array(
                'id' => 6,
                'name' => 'Farbe',
                'options' => array(
                    array('id' => 13,'name' => 'weiss'),
                    array('id' => 14,'name' => 'schwarz'),
                    array('id' => 15,'name' => 'blau'),
                    array('id' => 28,'name' => 'rot'),
                ),
            ),
        ),
    ),
    'variants' => array(...)
);

Quelle: Shopware Wiki
Um das rechenintensive Bilderberechnen vom Import oder Update Prozess über die API zu trennen muss ein 2. Request für den Artikel ausgeführt werden.

PUT /api/generatevarianimages/1
PUT /api/generatevarianimages/SW-200?useNumberAsId=true

Quelle Shopware Wiki

Beispiel für einen Aufruf des Bildermappings über die Shopware Rest API

<pre class="lang:default decode:true" title="Aufbau der Verbindung zur Shopware REST API">include_once('class.api.php');

/**	$url (string) */

$url = 'http://url/api';

/**	$user (string) */
$user = 'import';

/**	$key (string) */
$key = 'passwortString';

$client = new ApiClient($url,$user,$key);</pre>

$client->put('generatevarianimages/1');

Das war die Theorie und jetzt kommt die Praxis

Während der Beta Version, dem Release Candidate (RC) , der Preview und jetzt der offiziellen Version 4.2 ist viel geschehen. Die Version zum direkten Download der Shopware Seite war unvollständig. Es fehlte die Datei “engine/Shopware/Controllers/Api/GenerateArticleImages.php”, welche das Mapping bewerkstelligen sollte. Beim ausprobieren dieses Features hat dieser Fehler enorm Zeit gekostet bis ich eine Lösung gefunden habe.

Umstellungen zwischen den Version

Wer sich aufmerksam den API Befehl und die Datei anschaut wird schnell feststellen, dass da etwas falsch ist.

Controller werden in Shopware/ZendFramework nach einer bestimmten Namenkonvension aufgebaut.

“Shopware_Controllers_Api_GenerateArticleImages” zieht folgende Datei- und Ordner Struktur nach sich.

Shopware/Controller/Api/GenerateArticleImages

Bei der API lässt sich der Befehl “generateArticleImages” ableiten, jedoch wurde der Name “generatevarianimages” genutzt.
Zudem ist ein Schreibfehler aufgetaucht, “generatevarianimages” hätte “generatevariantimages” heißen müssen.

Dieser Fehler wurde nun behoben und der API Call richtig hinterlegt.

Die Dokumentation sollte nun so aussehen.

PUT /api/generateArticleImages/1
PUT /api/generateArticleImages/SW-200?useNumberAsId=true

Diese Beispiel wird den gewünschten Erfolg haben.

<pre class="lang:default decode:true" title="Aufbau der Verbindung zur Shopware REST API">include_once('class.api.php');

/**	$url (string) */

$url = 'http://url/api';

/**	$user (string) */
$user = 'import';

/**	$key (string) */
$key = 'passwortString';

$client = new ApiClient($url,$user,$key);

$client->put('generateArticleImages/1');