Zugriff auf Attribute via ModelManager

Hallo Allerseits!

wir haben für unser ERP-System eine Schnittstelle via Shopware-Plugin realsiert, die bis Shopware 5.3 tadellos läuft.

Seit Umstieg auf SW 5.3 klappt unser Zugriff auf sämtliche Attributs-Felder nicht mehr.

/** @var \Shopware\Models\Attribute\ArticleSupplier $supplier */
$supplier = $this->manager->getRepository('Shopware\Models\Attribute\ArticleSupplier')
->findOneBy(['my_field' => $my_value]);

Dieser wird nun an sämtlichen Stellen mit „Error: Unrecognized field: my_value“ quittiert.

Ich habe mich eingelesen und eine Weiche in der Bootstrap.php eingebaut:

private function createAttributes()
{
    /** @var ModelManager $em */
    $em = $this->container->get('models');
    $metaDataCache = $em->getConfiguration()->getMetadataCacheImpl();

    if ( SW52 ) {

        /** @var CrudService $service */
	    $service = $this->container->get('shopware_attribute.crud_service');
    
        $service->update('s_articles_supplier_attributes', 'my_field', 'integer', [
				'label' => 'My Field',
				'displayInBackend' => true,
				'position' => 900,
				'custom' => false,
				'translatable' => true,
			]);

    } else {

        $em->addAttribute(
				's_articles_supplier_attributes',
				'my',
				'field',
				'int(11)',
				true,
				null
			);
    }
    $metaDataCache->deleteAll();
    $em->generateAttributeModels();
}

 

Das Feld wird brav in der DB erzeugt, die Models werden nur nicht richtig aktualisiert?

Was hat sich geändert bzw. was mache ich falsch?

 

LG

René

 

 

 

Habs gerade in der Developer Dokumentation nachgetragen:

https://developers.shopware.com/developers-guide/cheat-sheet/#naming-attribute-generation

Wenn man einen Unterstrich in dem Feld Namen hat muss man bei der Query Camel Case nutzen.

Konnte das Verhalten allerdings auch bei 5.2 nachstellen.

Ich hoffe das hilft erstmal und löst dein Problem :wink:

Hallo taltholtmann,

 

danke für deine Rückmeldung.

Die Schreibweise mit CamelCase war uns auch vorher bewusst.

Tatsächlich steht in der DB “my_value I d”, der Zugriff via SW < 5.3 lautet: findByOne(‘my V alue I d’)

 

Mein Problem besteht weiterhin: ich habe in der Bootstrap folgendes zum Testen eingetragen:

$service->update('s_core_customergroups_attributes', 'test123', 'integer', [
	'label' => 'test123',
	'displayInBackend' => true,
	'position' => 1,
	'custom' => false,
	'translatable' => false,
]);

 

Nach einer Neuinstallation des Plugins und dem leeren des Caches existiert das Feld auch in der DB, jeweisl in der tabelle  s_core_customergroups_attributes und s_attribute_configuration.

Aber greife ich wie folgt auf meine neues Feld zu:

$group = $this->manager->getRepository('Shopware\Models\Attribute\CustomerGroup')
	->findOneBy(['test123' => "2"]);

bekomme ich weiterhin das hier: 

“Unrecognized field: test123”

Vielleicht würde es helfen, wenn du im Backend, unter Einstellungen->Freitextfeld-Verwaltung das gewünschte Model öffnest (Kundengruppe (s_core_customergroups_attributes)) und auf den Button „Model generierren“ (oben links) klickst?

Zusätzlich würde ich in der Datei var/cache/production_DATUM/doctrine/attribtutes/CustomerGroup.php schauen, ob das Feld „test123“ hier existiert

Hi waldicom,

danke für die hilfreichen Tips.

Habe im Backend die Models generieren lassen und in den Cache geschaut, meine Attribute sind vorhanden:

    /**
     * @var integer $test123
     *
     * @ORM\Column(name="test123", type="integer", nullable=true)
     */
     protected $test123;

Leider bekomme ich weiterhin diesen Fehler :confused:

Das Leeren des Proxy-Caches hat mein Problem mit dem Model-Zugriff gelöst.

Weiterhin besteht das Problem, dass auf ein Attribut ‚myPerfect I d‘ (DB: ‚my_perfect I d‘) ab SW 5.3 aufgrund des großen „i“ nicht mehr zugegriffen werden kann.

Der CRUD-Manager ist auch nicht im Stande, dieses Feld zu normalisieren. Ein Dreiecks-Tausch zum Umbenennen des Attributes via update()-Methode ist auch gescheitert.

Um ein Verlust der Daten in dem Attribut zu vermeiden, aber das Plugin kompatibel zu >= SW 5.3 zu halten, bleibt mir scheinbar nur noch:

ALTER TABLE `s_core_customergroups_attributes` CHANGE COLUMN `my_perfectId` `my_perfectid` INT(11) NULL;

in der Update-Routine für sämtliche betroffenen Attributs-Tabellen.

LG

René