REST-API Artikel-Eigenschaften

Hallo zusammen,

ich versuche, Shopware mit Artikeln direkt aus unserem WWS zu befüllen.

Ich umgehe die PHP-Bibliothek und schicke direkt einen JSON-String an die API. Bisher funktioniert alles ganz gut, nur stoße ich bei den Artikeleigenschaften an meine Grenzen. Ich möchte den Artikel mit einem eigenen Feld „USK“ befüllen.

Ich versuche via PUT den Artikel zu aktualisieren:

[
    {
        "name":"TestArtikel",
        "active":"1",
        "keywords":"TestArtikel",
        "tax":"19",
        "mainDetail":{
            "number":"01234",
            "inStock":"10",
            "ean":"0123456789012",
            "prices":[
                {
                    "customerGroupKey":"EK",
                    "price":"22"
                }
            ],
            "propertyValues":[
                {
                    "option":[
                        {
                            "name": "USK"
                        },
                        "value": "USK 12"
                    ]
                }
            ]
        }
    }
]

„propertyValues“ ist doch das richtige Objekt dazu ?

propertyValues.option.name und propertyValues.value passen mit den gesetzten Eigenschaften im Backend 1:1 überein.

Der Aufruf auf die API ist zwar erfolgreich, jedoch ist keine Eigenschaft am Artikel gesetzt worden.

Wo liegt der Fehler ?

 

Danke

Ich weiß zwar nicht, ob propertyValues das richtige Objekt dafür ist, aber laut Dokumentation ist propertyValues nicht in den mainDetails definiert. Vielleicht liegt da der Fehler?

Ist die Klammer hier richtig?

@NextMike schrieb:

Ist die Klammer hier richtig?

image

nein! 

@Argee schrieb:

@NextMike schrieb:

Ist die Klammer hier richtig?

image

nein! 

Der Schnittstellenbeschreibung zufolge ist die Klammer korrekt:

    'propertyValues' => array(
        array(
            'option' => array('name' => "Alcohol content"), // '10%'
        ),
        array(
            'option' => array('name' => "Color"), // 'rot'
        )
    )

 Seht hier: https://developers.shopware.com/developers-guide/rest-api/examples/article/#example-6-article-properties

Dies habe ich versucht:

"propertyValues":[
    {
        "option": {
            "name": "USK",
            "value": "USK 12"
        }
    }
]

Und dies:

"propertyValues":{
    "option": {
        "name": "USK",
        "value": "USK 12"
    }
}

Wobei der letzte Eintrag für mich garkeinen Sinn macht.

Ergebnis bleibt das Gleiche:
API-Aufruf ist ein Erfolg, jedoch keine Eigenschaften gesetzt

Haben Sie zuerst im Menu Artikel -> Eigenschaften, die Eigenschaft “USK” hinzugefügt ?

Haben Sie schon mal im Backend ein Artikel angelegt mit solche Eigenschaft und dann über die API mit GET abgefragt ? Dann sehen Sie die genaue Struktur die mann braucht zum POSTen.

Braucht mann da keine ‘filterGroupId’ ?

1 Like

Danke WillemMeert,

ich habe im Backend die Eigenschaft angelegt. Leider sieht die Datenstruktur beim GET anders aus:

"propertyValues": [
    {
        "id": 324,
        "value": "USK 6",
        "position": 1,
        "optionId": 26,
        "mediaId": null
    }
]

Selbst so funktioniert der PUT nicht.

Immerhin hat das Setzen der ‚filterGroupId‘ schon mal bewirkt, dass das richtige Eigenschafts-Set im Backend angezeigt wird.
Leider werden die Eigenschaften an sich jedoch auch mit verschiedenen Tests des ‚propertyValues‘-Objekt nicht gesetzt…

So funktioniert es endlich:

        "propertyValues":[
            {
                "option": {
                    "name": "USK"
                },
                "value": "USK 6"
            }
        ]

Eine eckige Klammer beim ‚options‘ Objekt war zu viel und zusammen mit dem Setzen der ‚filterGroupId‘ funktioniert es endlich.

Danke WillemMeert für den Tipp in die richtige Richtung !

@Tinklohl schrieb:

@Argee schrieb:

@NextMike schrieb:

Ist die Klammer hier richtig?

image

nein! 

Der Schnittstellenbeschreibung zufolge ist die Klammer korrekt:

‘propertyValues’ => array(
array(
‘option’ => array(‘name’ => “Alcohol content”), // ‘10%’
),
array(
‘option’ => array(‘name’ => “Color”), // ‘rot’
)
)

 

Die Klammer ist dort nicht korrekt, weil sie zu einem ungültigen JSON-String führt. In JavaScript (und damit auch im JSON-Format) bedeuten geschwungene Klammern {} ein Objekt. Hier muss man immer ein Key-Value-Paar schreiben, also zB.:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": "value4"
}

Eckige Klammern hingegen zeigen ein Array an und dieses kann in JSON nur Werte beinhalten, also zB.:

["value1","value2","value3"]

In PHP arbeitet man hingegen mit “Arrays” (vergleichbar dem Array in JSON) und “Associative Arrays” (vergleichbar dem Objekt in JSON). Da steht aber so etwas wie

["key": "value"]

und das gibt es in JSON einfach nicht.

So weit korrekt. Die eckige Klammer muss sich durch einen Fehler in der Programmierung unserer WWS-Schnittstelle eingeschlichen haben. Letztendlich fehlte doch die ‘filterGroupId’, damit der Call auf die API funktioniert. Dieser Hinweis kam erst durch WillemMeert’s Anwort.

BTW werden Assoziative Arrays in PHP folgendermaßen deklariert  Smile

["key" => "value"];