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

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: