Zusatzfelder per Plugin Migration Script anlegen

Hi, ich hab ich der Doku nichts gefunden, wie ich beio der Plugininstallation mit dem Migrations-Script Zusatzfelder für Produkte (Set mit Feldern) anlegen kann.

Kennt jemand einen Weg, wie das geht?

nimm dazu 

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

beispiel ungetestet:
 

// dein Plugin Bootstrap
public function install(InstallContext $context): void {
    $customFields = [
        [
            'name' => 'my_custom_field_set',
            'active' => true,
            'config' => [
                'label' => [
                    'en-GB' => 'my customFieldSet label',
                    'de-DE' => 'mein customFieldSet label'
                ],
            ],
            'customFields' => [
                [
                    'name' => 'my_custom_field_config',
                    'type' => \Shopware\Core\System\CustomField\CustomFieldTypes::TEXT,
                    'config' => [
                        'label' => [
                            'en-GB' => 'my customFieldConfig label',
                            'de-DE' => 'mein customFieldConfig label',
                        ]
                    ]
                ],
                [
                    'name' => 'my_custom_field_other',
                    'type' => \Shopware\Core\System\CustomField\CustomFieldTypes::TEXT,
                    'other' => [
                        'label' => [
                            'en-GB' => 'my customFieldOther label',
                            'de-DE' => 'mein customFieldOther label',
                        ]
                    ]
                ]
            ],
            'relations' => [
                [
                    'entityName' => 'product'
                ]
            ]
        ]
    ];
    $repo = $this->container->get('custom_field_set.repository');

    foreach ($customFields as $customFieldSet) {
        $repo->upsert([$customFieldSet], $context);
    }
}

 

2 Likes

Oh sieht gut aus. Muss ich nachher mal testen. Danke

Hi,

ich habe die Diskussion hier verfolgt und habe gerade ein ähnliches Problem. Ich versuche für die Eigenschaften ein Zusatzfeld anzulegen (also property_group_option). 

Die CustomFields an sich werden über das Migrations-Script (siehe oben) angelegt und sind auch in der DB vorhanden.

$customFieldSet = [
    [
        'name' => 'custom_option',
        'active' => true,
        'config' => [
            'label' => [
                'en-GB' => 'Custom Fields Configurator',
                'de-DE' => 'Zusatzfelder Konfigurator'
            ],
        ],
        'customFields' => [
            [
                'name' => 'custom_option_price',
                'type' => CustomFieldTypes::TEXT,
                'config' => [
                    'label' => [
                        'en-GB' => 'Price',
                        'de-DE' => 'Preis',
                    ]
                ]
            ],
        ],
        'relations' => [
            [
                'entityName' => 'option'
            ]
        ]
    ]
];
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository->create($customFieldSet, Context::createDefaultContext());

Die Frage ist nun, wie bekomme ich das Feld in der entsprechenden Maske bei den Eigenschaften angezeigt. Die Anleitung hier (Shopware 6: Add field to module in administration) bin ich schon durch. 

Im Template sw-property-option-detail.html.twig habe ich das Feld versucht so anzulegen

 

1 Like

Ich würde sagen, die Zuordnung “option” gibt es nicht.

'relations' => [
            [
                'entityName' => 'option'
            ]
        ]

Ich habe zb “product” und das Feld wird dann auch automatisch bei der Bearbeitung von Produkten mit angezeigt.

Ich habe übrigens mir die Installation von SwagSocialShopping angeschaut und den Installer für mein Plugin nachgebaut. Die haben noch ein paar Checks eingebaut, dass bei einer Neuinstalltion nicht erneut versucht wird, die Felder anzulegen.

ich führe nur ein upsert aus.

$this->customFieldSetRepository->upsert(...);

 

Hallo zusammen,

ich habe ein ähnliches oder vielleicht sogar das gleich Problem wie doerndorfer.

Allerdings habe ich bei bestehenden PropertyValues ein Zusatzfeld, welches mit den den customFields-Einträgen aus der Datenbank kommuniziert.

Ich habe das Problem, dass ich nun keine neuen PropertyValues anlegen kann, weil es dieses Feld angeblch nicht gibt.  

Das ist die fehlermeldung dazu.

Hat dafür jemand eine Lösung?

@doerndorfer‍ der entityName lautet ‚property_group_option‘ nicht ‚option‘

@pino schrieb:

ich führe nur ein upsert aus.

$this->customFieldSetRepository->upsert(…);

 

Hallo!

Für ein Plugin lege ich 

public function install(InstallContext $context): void

 meine Zusatzfelder an. Das klappt hervorragend, so wie es hier beschrieben wurde. 

Beim Deinstallieren möchte ich die Felder nicht löschen.

Wenn nun das Plugin wieder installiert werden soll, so ist dies nicht möglich, da die Zusatzfelder bereits existieren. Und das obwohl ich ein „upsert“ aufrufe.

Kann mir da jemand weiterhelfen? 

Danke!

Hallo @lhairman‍

das scheint bei mir auch so zu sein. Obwohl ich vermutet hätte, dass genau dieser Fehler bei einem upsert() nicht auftritt.

Ich führe nun vor dem upsert() ein search() durch, um zu prüfen, ob das Custom Field Set bereits existiert:

$criteria = (new Criteria())
	->addFilter( new EqualsFilter('name', $customFieldSetName) );

$existingCustomFieldSets = $customFieldSetRepository
	->search($criteria, $context->getContext())
	->getTotal();
	
if ($existingCustomFieldSets == 0) {
	$customFieldSetRepository->upsert($customFieldSet, $context->getContext());
}

Lg

1 Like

Danke für die Info! Ich habe bis jetzt auch noch keine andere Lösung gefunden. Werde ich mit dem search probieren.