Properties aktualisieren im Product

Hallo zusammen, wir sind derzeit dran per Rest api unsere Artikel in den Shop zu laden, das klappt auch wunderbar und die Properties werden korrekt mit übergeben, jedoch wird, bei einer aktualisierung einer propertie zum Beispiel von Ja auf Nein dann beides in den Artikeleigenschaften angezeigt. Wie kann man die vorherigen Werte überschreiben?

derzeitiger call ist /api/product/ID method PATCH

body:

{„manufacturerId“:„018b8fb55106788080b533e883270b62“,

„manufacturerNumber“:„JP 25“,

„categories“:[{„id“:„018afa02d50c7918aaf79dd912f6f39c“}],

„stock“:1050,

„price“:[{„currencyId“:„b7d2554b0ce847cd82f3ac9bd1c0dfca“,

„gross“:20.110999999999997,„net“:16.9,„linked“:false}],

„markAsTopseller“:true,

„taxId“:„0189d54bac00707faf152ce27ad644d2“,

„customSearchKeywords“:["JP 25 ",„7161658576“],

„customFields“:{

„erp-mapping_product_matchcode“:„JP 25“,

„erp-mapping_genau“:„1“,„erp-mapping_waege“:„1“,

„erp-mapping_product_artikelgruppe“:„112“,

„erp-mapping_umkarton“:42},

„properties“:[{„id“:„018b481e24657f18aa759ea072905da0“},

{„id“:„018b481cdf257cb6b39258a348a0b3e2“},

{„id“:„018b481d66ab73fa816991e60dd03729“},

{„id“:„018b18d56a687ca9859c50ece432ddea“},

{„id“:„018b18c6fbb47eeaa599ef9267941596“},

{„id“:„018b18cb2afe7c1e9d055f07c26dc9a6“},

{„id“:„018b18ceccb87e92a2ad265b2e823dbe“}]}

Du musst beim Update der Eigenschaften, die ID der bereits angelegten Eigenschaft mitgeben, da du ja keine neue Zuweisung anlegen möchtest, sondern eine bestehende Zuweisung ändern möchtest.

Das leuchtet mir jetzt grade nicht ein ehrlich gesagt. Sagen wir der Artikel hat die Eigenschaftsgruppe Größe darunter haben wir S,M,L,XL zur auswahl. Ich habe bei einem Artikel größe S ausgewählt. Jetzt ändert sich nach einem Monat die Produktion und der Artikel wird in größe L hergestellt. Das heißt ich müsste S und L mit übergeben laut deiner erklärung? Oder verstehe ich das falsch?

Ich bin mir nicht ganz sicher, aber es kann sein, dass du SO nur ergänzen kannst. Du musst auf jeden Fall bei einer Änderung von S auf L, die „property_group_option_id“ der neuen Größe L mitgeben (S nicht mehr). Vermutlich musst du aber im Vorfeld das S löschen und dafür einen separaten Aufruf für ProductProperty machen.

Hast du eine Idee wie man die Property löscht? Dazu finde ich nicht wirklich was

Vielleicht kannst du einen leeren Array für properties übergeben. Ansonsten gibt es statt PATCH auch DELETE, aber ich glaube für ProductProperty gibt es keinen eigenen Endpoint, daher muss du wohl über das Produkt gehen + PATCH nutzen.
https://shopware.stoplight.io/docs/admin-api

Bei einem leeren Array, bleibt leider alles so zugeordnet wie es vorher war. Übergebe ich die Werte mit null kommt es muss eine valid UUID sein

Ich habe das mal für dich recherchiert + getestet ;-). So wie du das bisher machst kannst du nur ergänzen. Löschen muss anders gemacht werden:
der call ist /api/_action/sync method POST
Im payload kannst du auch mehrere übergeben
$post = [[‚entity‘ => ‚product_property‘,
‚action‘ => ‚delete‘,
‚payload‘ => [[‚productId‘ => ‚DEINE_PRODUKTID‘, ‚optionId‘ => ‚DEINE_PROPERTYID‘]]
]];
den Post noch in JSON umwandeln

Ich kann dich auch gern beim IMPORT via API unterstützen, melde dich unter info@web-grips.de

Das obige kannst du zum Löschen vieler Daten benutzen, wenn du nur einzelne Löschen möchtest kannst du auch das nutzen
DELETE /api/v3/product/{productId}/properties/{optionId}

Hier noch ein Link dazu: Product Data | Shopware Documentation

Hallo nochmal,

das beudetet aber ich muss erst alle properties löschen und dann neu einspielen richtig? Kann man irgendwie nen call geben dass alle propertys gelöscht werden oder muss ich mir jede einzelne ID raussuchen und dann löschen? Habe den gleichen Fall gerade bei den SpecialPrices for Customers… da muss ich dann auch erst die IDs finden alle einzeln löschen und dann neu hochladen. Das ist extrem schlecht umgesetzt finde ich.

Hallo, du kannst die bestehenden Properties des Produktes über eine „search“ Anfrage holen + dann das Löschen zusammenbauen.
Ich würde mich sehr freuen, wenn du uns eine Bewertung auf Google hinterlässt Google Maps
Schönes Wochenende, Oliver

Hallo Oliver,

vielen Dank, so hab ich es jetzt auch gemacht. Leider etwas blöd da man, so wie ich herausbekommen habe, immer nur eine Property auf einmal löschen kann pro call. Oder hast du da eine andere Lösung?
Vor allem muss man dann bei allem immer erst eine Anfrage stellen sich die IDs holen und dann löschen. Das gilt für suchwörter, properties, adressen etc. Echt nicht gut durchdacht.

Wenn du die erste Variante mit dem Payload verwendest kannst du beliebig viele Props übergeben. Es gibt einen kleinen Trick, mit dem man ohne Anfrage auskommt. Dazu kann man die „ID“ selbst nach eigener Logik generieren (z.B. (string)md5(PropertyName.PropertyWert.irgendwas) + dann braucht man nicht mehr abzufragen, da man die ID ja selbst generiert hat.

Ich würde mich sehr freuen, wenn du uns für die Hilfe eine Bewertung auf Google hinterlässt Google Maps

Hallo, da man mit mit dem Adminbereich von SW6 nicht arbeiten kann, beschäftigen wir uns nun wohl oder übel mit der API. In deinem Beitarg sind wir auf das gestoßen was wir aktuell benötigen aber leider weiter kommen. Aktuell haben wir:

{
	"delete-product-property": {
	"entity": "product_property",
	"action": "delete",
	"payload": 
		[
			{
				"productId": "01904e1b2fcf713f8d7f8a8e0481ecd2",
				"optionId": ""
			}
		]
	}
}

Du schreibst, die IDs kann man sich mit einer Searchanfrage holen, aber wir finden keinerlei Informationen, die für uns verständlich sind, wie man dieses Search davor setzt und die ermittelten Werte an der betreffenden Stelle einsetzen kann. Könntest Du uns hier bitte helfen?

Hallo tk1,
hier mal eine schnelle Lösung (die ich nicht getestet habe, daher können Tippfehler etc. drin sein).
Hinweis: $this->_getCurl() ist meine PHP-Fkt. für den Aufruf der API, das wird bei dir anders sein.
Als erstes ermittelst du das gewünschte Produkt mit der ARTNR.
$post = [‚page‘ => 1,
‚limit‘ => 1,
‚filter‘ => [‚productNumber‘ => ‚DEINE ARTNR‘)]
];
$result = $this->_getCurl(‚search/product/‘, ‚POST‘, json_encode($post));
foreach ($result->data as $item) {
foreach ($item->attributes->propertyIds as $optionId) {
//Payload für das Delete zusammenbauen
$payload = [‚productId‘ => $item->id, ‚optionId‘ => $optionId];
}
$post2 = [[‚entity‘ => ‚product_property‘,
‚action‘ => ‚delete‘,
‚payload‘ => $payload
]];
$result2 = $this->_getCurl(‚_action/sync‘, ‚POST‘, json_encode($post2));
}

Gern können wir dir bei Shopware bzw. der API helfen, oder für dich etwas programmieren, melde dich gern.
Wenn dir die Lösung hilft freuen wir uns gern auf eine kurze Bewertung auf Google Google Maps

Liebe Grüße WEB-Grips

Besten Dank, schaue ich mir mal an.

1 „Gefällt mir“