Customer Entity Extension mit Scalar Values möglich, aber wie?

Hi zusammen,

ich möchte gerne in der Customer Tabelle ein neues Feld anlegen, die die Anzahl der Anmeldungen loggt.

Die Custom Fields sorgen mir für zuviel Overhead und eine Entity Extension mit einer eigenen Tabelle sorgt auch wieder für unnütze Joins.

Laut Shopware Doku ist es möglich einer Entity Extension auch Scalar Values mitzugeben. Ich hab also versucht, ein IntField an den Customer zu hängen

class CustomerExtension extends EntityExtension
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
           (new IntField('amount_login', 'amountLogin',null,null))
        );

    }

    public function getDefinitionClass(): string
    {
        return CustomerDefinition::class;
    }
}

Nun kriege ich aber eine Exception, die mir sagt: „Only AssociationFields, FkFields/ReferenceVersionFields for a ManyToOneAssociationField or fields flagged as Runtime can be added as Extension.“

In der Shopware-Doku finde ich nichts dazu, was da genau möglich ist und was nicht. In der Doku steht nur, dass es prinzipiell möglich ist.

Sind Scalar Values als Entity Extension nur als Runtime-Flag möglich? Und wenn ich das richtig sehe, müsste ich mich bei einem Runtime-Flag dann über einen Subscriber darum kümmern, dass das Feld an das Customer Objekt gehängt wird? Und um die Migration müsste ich dann auch selbst kümmern mit einem „ALTER TABLE ADD…“?

Vielen Dank für die Hilfe!!

LG Ben

1 „Gefällt mir“

Späte Antwort, aber ich hatte ein ähnliches Problem: Produkte sollen mehrere zusätzliche Felder/Eigenschaften für prozentuale Werte bekommen, also einfache, skalare Integer-Felder.

Die Dokumentation ist leider auch drei Jahre später immer noch recht knapp gehalten und geht nicht auf solche Details ein. An anderer Stelle steht, es ginge auch mit JSON, sofern nur skalare Werte benötigt werden. Dort war mir wiederum unklar, ob sich auch bestehende Core Entitities wie Produkte auf diese Weise programmatisch erweitern lassen, oder ob das nur per Admin UI oder API Endpoint möglich ist.

Wie lautet die Lösung bzw. was ist die Best Practice? Vermutlich so: in der Plugin-Klasse die Lifecycle-Methode install implementieren und dort ein customFieldSetRepository kreieren, das die gewünschten Skalare beschreibt. Etwa so wie folgt.

    public function install(InstallContext $installContext): void
    {
        parent::install($installContext);

        $customFieldSetRepository = $this->container->get('custom_field_set.repository');

        $customFieldSetRepository->create([
            [
                'name' => 'ingos_example_custom_field_set',
                'config' => [
                    'label' => [
                        'de-DE' => 'Kostenfaktoren',
                        'en-GB' => 'Cost Factors',
                        Defaults::LANGUAGE_SYSTEM => 'Cost Factors',
                    ]
                ],
                'customFields' => [
                    [
                        'name' => 'ingos_example_percentage_01',
                        'type' => CustomFieldTypes::INT,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Kostenfaktor 1 Prozentsatz',
                                'en-GB' => 'cost factor 1 percentage',
                                Defaults::LANGUAGE_SYSTEM => 'cost factor 1 percentage',
                            ],
                            'type' => 'number',
                            'numberType' => 'int',
                            'customFieldType' => 'number',
                            'step' => 1,
                            'min' => 0,
                            'max' => 100,
                            'customFieldPosition' => 1,
                        ],
                        'active' => true,
                    ],
                ],
                'relations' => [
                    [
                        'entityName' => 'product',
                    ],
                ],
            ],
        ], $installContext->getContext());
    }
}

Quellen: Shopware Doku, diverse Blogs, StackOverflow und dieser hilfreiche Forenbeitrag:

Es gibt grundsätzlich drei Möglichkeiten neue Felder an Entities zu hängen:

Man könnte theoretisch auch direkt Anpassungen an einer Tabelle vornehmen, mit Plain SQL arbeiten und das Feld dann mit einer Runtime Entity Extensions über Plain SQL lesen und befüllen. Davon ist aber wegen Updatefähigkeit etc. abzuraten.