REST Api // eigene Attribute

Wie befülle ich über die REST-Api eigene Attribute/eigene Freitextfelder für Produkte?

Ein PUT auf bestehende Produkte mit den Daten

Array
(
    [attribute] => Array
        (
            [attr1] => test
        )

)

funktioniert tadellos. Aber ein PUT auf

Array
(
    [attribute] => Array
        (
            [inhalt_tab_titel1] => test
        )

)

Wobei “inhalt_tab_titel1” ein eigenes Freitextfeld ist funktioniert nicht und der DB-Inhalt bleibt auf “NULL”

Ich hab jetzt alles umgestellt auf die Standardspalten (attrX)…schade das es wohl anders nicht geht :frowning:

Shopware ermöglicht dir auch die API zu erweitern oder eine eigene Api-Schnittstelle zu bauen.

Die Interaktion mit eigenen Freitextfeldern KÖNNTE womöglich einen solchen Schritt unabdingbar machen sollten die neuen Felder über die normale Api nicht automatisch mitgegeben und abgedeckt werden.

Rückgaben der Artikeldetails sind übrigends deutlich detaillierter als es die Listenrückgabe ist, vielleicht reicht es schon den Artikel einzeln über die Api zu laden?

Ansonsten:

https://developers.shopware.com/developers-guide/rest-api/plugin-api-extension/

Vielleicht hilft dir das ja etwas weiter, wir haben uns auch schon einige Extra-Api-Endpunkte gebaut.

2 Likes

Hi, übergib mal deine Attribute ohne Unterstriche in dem REST Array, damit sollte es gehen, ggf. die Freitextfelder auch ohne Unterstriche anlegen.

Beste Grüße

Edin

6 Likes

@edin schrieb:

Hi, übergib mal deine Attribute ohne Unterstriche in dem REST Array, damit sollte es gehen, ggf. die Freitextfelder auch ohne Unterstriche anlegen.

Beste Grüße

Edin

Danke, @edin! Ich hatte genau das gleiche Problem. Mein Attribut in Shopware heißt „remote_id“. Über die API konnte ich das Attribut jedoch einfach nicht befüllen. Befülle ich via der REST API aber das Feld „remoteid“, funktioniert alles. Diese Antwort sollte als die akzeptierte Antwort festgelegt werden!

2 Likes

gerne, freut mich dass ich helfen konnte. Hatte selbst das Problem, zum Glück konnte ich direkt bei Shopware nachfragen, praktisch wenn ein Kunde direkt Entwicklersupport in der Subscription hat :) 

Ich versuche für mein Plugin gerade das selbe, aber es klappt einfach nicht, mein eigenes Attribut über die API zu befüllen.

$array['mainDetail']['attribute']['attr1'] = 'xyz'; // funktioniert
$array['mainDetail']['attribute']['meintestattribut'] = 'xyz'; // funktioniert nicht

Nach meinen Quellcode-Recherchen werden Attribute wohl über eine Klasse

 \Shopware\Models\Attribute\Article

gesetzt. Die scheinbar dynamisch von Doctrine generiert wird, denn die zugehörige Datei liegt im Cache-Ordner unter

 /var/cache/production\_XXXXXX/doctrine/attributes/Article.php

Und hier gibt es nur Getter/Setter-Methoden für Attr1 bis Attr20.
Theoretisch müssten hier doch auch die Methoden “getMeintestattribut()” und “setMeintestattribut()” vorhanden sein.

 

Mache ich beim Anlegen des Attributs in meinem Plugin etwas falsch?

/** @var CrudService $service */
$service = $this->container->get('shopware_attribute.crud_service');
$service->update(
  's_articles_attributes',
  'meintestattribut',
  TypeMapping::TYPE_TEXT,
  [
    'label' => 'Mein Attribut',
    'translatable' => false,
    'displayInBackend' => true,
  ]
);

 

Einfach mal über die API per GET ausgeben lassen, dann sieht man den Namen ja. Denke das ist irgendwas mit CamelCase/SnakeCase

1 Like

Ja genau, hatte das selbe Problem siehe meine Lösung und die Erklärung hier: s_articles_attributes Freitextfeld per API befüllen

1 Like

@stormerMike schrieb:

Ja genau, hatte das selbe Problem siehe meine Lösung und die Erklärung hier: s_articles_attributes Freitextfeld per API befüllen

Die Problematik mit den Unterstrichen war in diesem Thread ja auch das Thema. Tatsächlich hatte ich auch erst Unterstriche in meinem Attribut-Bezeichner, aber ohne Unterstriche funktioniert es eben auch nicht.

 

 

@ahmadsaad schrieb:

Einfach mal über die API per GET ausgeben lassen, dann sieht man den Namen ja. Denke das ist irgendwas mit CamelCase/SnakeCase

 

Gute Idee und wie sich im GET-Request zeigt, wird mein Attribut gar nicht mit ausgegeben.
In der Datenbank wird die zugehörige Spalte erstellt und auch im Backend im Artikel-Fenster kann ich es wie gewünscht nutzen.

Lege ich das Attribut in meiner Plugin Install-Methode falsch an?

 

Hab es rausgefunden.

Man sollte die Dokumentation aufmerksam und detailliert durchlesen Grin

https://developers.shopware.com/developers-guide/attribute-system/#rebuild-attribute-models

So sieht mein Install-Code nun aus und damit ist das Attribut über die API lesbar und beschreibbar:

/** @var CrudService $service */
$service = $this->container->get('shopware_attribute.crud_service');
$service->update(
  's_articles_attributes',
  'meintestattribut',
  TypeMapping::TYPE_TEXT,
  [
    'label' => 'Mein Attribut',
    'translatable' => false,
    'displayInBackend' => true,
  ]
);


/** @var ModelManager $modelManger */
$modelManger = $this->container->get('models');
$metaDataCache = $modelManger->getConfiguration()->getMetadataCacheImpl();
$metaDataCache->deleteAll();
$modelManger->generateAttributeModels(['s_articles_attributes']);

 

Rebuild attribute models

Ist das das gleiche wie „Model generieren“ unter der Freitextfeld-Verwaltung im Backend?

Was hat Dein Code mit „Rebuild attribute models“ zu tun?

@NextMike schrieb:

Rebuild attribute models

Ist das das gleiche wie „Model generieren“ unter der Freitextfeld-Verwaltung im Backend?

Was hat Dein Code mit „Rebuild attribute models“ zu tun?

Stimmt, der Button „Model generieren“ führt den selben Code aus:

// shopware\engine\Shopware\Bundle\AttributeBundle\Controllers\Backend\Attributes.php

/** @var ModelManager $entityManager */
$entityManager = $this->get('models');
$entityManager->generateAttributeModels([$table]);

Wie ich weiter oben ja schon recherchiert habe, generiert Shopware/Doctrine dynamisch eine Klasse für die Artikel-Attribute.
Diese Klasse leitet wie wahrscheinlich so ziemlich jedes Model in Shopware von der abstrakten Basisklasse ModelEntity ab.

Und die Klasse ModelEntity enthält eine Methode fromArray().

Diese Methode nimmt ein übergebenes Array und ruft über die dort enthaltenen Schlüssel dynamisch die zugehörigen Setter-Methoden auf, sofern vorhanden.

Wenn also an die API die als Array formatierten Daten übergeben werden, dann befüllt Shopware über diese Methode die zugehörigen Models.

// Eingabe-Array
array(
 'attr1' => 'xyz',
 'meintestattribut' => 'abc'
);

// Shopware prüft für jeden Array-Eintrag, ob es eine zugehörige Mehtode gibt und ruft diese auf
// gibt es keine zum Schlüssel passende Methode, wird der zugehörige Wert einfach ignoriert
$this->setAttr1('xyz');
$this->setMeintestattribut('abc');

Deshalb hat bei mir die Übergabe von Werten für die Standard-Attribute attr1 bis attr20 funktioniert, aber für mein selbst erstelltes Attribut nicht, weil in der dynamischen Doctrine-Klasse eben noch keine set-Methode dafür vorhanden war.

Beim Bearbeiten/Speichern von Artikeln im Backend geht Shopware übrigens einen anderen Weg. Hier werden für Attribute nicht erst ein Model befüllt, sondern die Attribut-Werte direkt in die Datenbank geschrieben.
Auch ein Grund, warum im Backend alles problemlos geklappt hat, über die API aber nicht.

@floatax schrieb:

@edin schrieb:

Hi, übergib mal deine Attribute ohne Unterstriche in dem REST Array, damit sollte es gehen, ggf. die Freitextfelder auch ohne Unterstriche anlegen.

Beste Grüße

Edin

Danke, @edin! Ich hatte genau das gleiche Problem. Mein Attribut in Shopware heißt „remote_id“. Über die API konnte ich das Attribut jedoch einfach nicht befüllen. Befülle ich via der REST API aber das Feld „remoteid“, funktioniert alles. Diese Antwort sollte als die akzeptierte Antwort festgelegt werden!

Witzig, ich habe auch ein Feld „remote_id“, und habe es mit CamelCase „remoteId“ übergeben wollen. Funktioniert nicht. Es muss wirklich „remoteid“ sein. Geht auch bei Herstellern über den Parameter „attribute“. 

Hm, aktuell sitze ich vor einem ähnlichen Problem:

In der Datenbank gibt es die Spalte “dk_order_one”. Per GET wird dieses Attribut als “dkOrderOne” angezeigt. Nun möchte ich dieses Attribut per PUT updaten. Geht aber nicht. Weder die Schreibweise “dkOrderOne” oder “dkorderone” oder “dk_order_one”.

Nichts funktioniert :frowning:

 

War in dem anderen API-Thread etwas hilfreich? Falls ja, bitte markieren, damit die Lösung für die Nachwelt sichtbar bleibt.

Was mich betrifft leider nicht. Jedenfalls was dieses Thema hier betrifft.

However, I just couldn’t fill the attribute via the API. But if I fill the field „remoteid“ via the REST API, everything works. This answer should be set as the accepted answer!