Ich lege ein Hersteller-Attribute nach folgendem Schema an. $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>addAttribute( "s\_articles\_supplier\_attributes", "my", "newAttribute", "INT", false, 0 ); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_supplier\_attributes') );
So wird zwar das Attribute in der Datenbank hinterlegt, jedoch ist es nicht möglich über den ModelManager von Shopware darauf zurückzugreifen. Der folgende Code wird mir nur mit einem Ausnahmefehler quittiert, dass das Feld nicht gefunden werden konnte: $myNewAttribute = Shopware()-\>Models()-\>getRepository('Shopware\Models\Attribute\ArticleSupplier')-\>findOneBy(array('my\_newAttribute' =\> 'AttributeValue'));
Ich habe zwar bereits in folgendem Post [HowTo] zusätzliche Artikel-Attribute in Frontend + Backend eine Alternative gefunden, indem einfach direkt ein Query über Shopware()->Db()->fetchAll() druchgeführt wird, jedoch widerstrebt mir dieses Vorgehen. Dafür ist ja nun mal eigentlich das ORM und der ModelManager da. Hab ich denn bei der Anlage etwas falsch gemacht? Oder beim Zugriff mit dem Repository? Wäre toll, wenn jemand eine Idee dazu hätte.
Dein Attributname scheint mir falsch zu sein. Rein logisch müsste es ‘myNewAttribute’ sein, da Doctrine die Unterstriche in Camel-Case umwandelt. Du kannst aber ganz einfach in die ArticleSupplier.php im Verzeichnis ‘engine/Shopware/Model/Attribute’ gehen und dort nachschauen. Wenn alles richtig registriert wurde, wovon ich erstmal ausgehe wenn dein Feld in der Datenbank erscheint, sollte hier eine Funktion ‘getMyNewAttribute()’ erzeugt worden sein. Bei mir wird kein Fehler geworfen, wenn ich den Befehl ausführe. Allerdings scheint er mir auch keinen Wert zurückzuliefern, weswegen evtl. noch etwas anderes falsch ist. Kleiner Tipp: Die Zeilen $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll();
werden (ab v4.0.4, glaube ich) nicht mehr benötigt, da Shopware()->Models()->generateAttributeModels(…) (bzw. die hiervon aufgerufene Methode ‘regenerateAttributeProxies’) das an der passenden Stelle selber macht.
Tatsächlich hing es mit dem Unterstrich zusammen. Ich hatte ja bereits innerhalb des Models mit getMyNewAttribute gearbeitet. Ich dachte halt findOneBy erwartet in den Kriterien die Tabellenspalte und nicht den gemappten Objekt-Eigenschaftsnamen. Vielen dank für die Hilfe!