@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.