Custom FIelds bei Plugin-Aktivierung schreiben

Ich habe für dieses Problem leider nirgendwo etwas finden können, daher frage ich hier.
Ich will bei der Aktivierung oder Installation meines Plugins abfragen ob eine Custom Field Set vorhanden ist und es ggf. anlegen. Wie mache ich das?
Ich habe Funktionen wie install(InstallContext $installContext): void in die Plugin Klasse eingefügt aber wie greife ich auf die Custom Fields Repository zu?

1 „Gefällt mir“

Moin, das Thema hatte ich gerade :slight_smile:

In deiner Basis-Plugin Datei (extends Plugin) in der install function kannst du eigene customFields anlegen.
Wie man aber prüft ob die angelegt sind, habe ich nicht rausgefunden. Da die customFields aber auch nach dem Löschen des Pattern in den Elementen (zB Produkt oder Bestellung) verbleiben, habe ich die Elemente einfach grundsätzlich in der uninstall function gelöscht.

Hier als Beispiel unser Eintrag in den customFields der Bestellungen (entityName = order)

public function install(InstallContext $installContext): void {
$customFieldSetRepository = $this->container->get('custom_field_set.repository');

        $customFieldSetRepository->create([
            [
                'name' => 'kale_custom_field_set',
                'config' => [
                    'label' => [
                        'de-DE' => 'Kundendaten',
                        'en-GB' => 'Customer Dates'
                    ]
                ],
                'customFields' => [
                    [
                        'name' => 'kale_custom_field_set_shipping_date',
                        'type' => CustomFieldTypes::DATETIME,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Versanddatum',
                                'en-GB' => 'Shipping Date'

                            ],
                            'type' => 'date',
                            'customFieldType' => 'date',
                            'customFieldPosition' => 1,
                            'validation' => 'required'
                        ]
                    ],
                    [
                        'name' => 'kale_custom_field_set_delivery_date',
                        'type' => CustomFieldTypes::DATETIME,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Wunschlieferdatum',
                                'en-GB' => 'Delivery Date'
                            ],
                            'type' => 'date',
                            'customFieldType' => 'date',
                            'customFieldPosition' => 2,
                            'validation' => 'required'
                        ]
                    ],
                    [
                        'name' => 'kale_custom_field_set_start_date',
                        'type' => CustomFieldTypes::DATETIME,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Startdatum (optional)',
                                'en-GB' => 'Start Date (optional)'
                            ],
                            'type' => 'date',
                            'customFieldType' => 'date',
                            'customFieldPosition' => 3
                        ]
                    ]
                ],
                'relations' => [
                    [
                        'id' => Uuid::randomHex(),
                        'entityName' => 'order'
                    ]
                ]
            ]
        ], $installContext->getContext());
}

In der uninstall function habe ich einfach direkt am Anfang das hier ausgeführt:

$connection = $this->container->get(Connection::class);
$connection->executeUpdate('DELETE FROM `custom_field_set` WHERE name LIKE \'kale_custom_field_set\'');

Ich hoffe das hilft dir weiter :slight_smile:

2 „Gefällt mir“

Danke, so scheint es zu funktionieren. Ich habe jetzt nur das Problem dass die Custom Fields z.B. auf der Produktseite gar nicht geladen werden. Ich muss das entsprechende Event überschreiben und die Felder manuell aus der DB laden. Scheint nur ohne das zu funktionieren wenn erst das Feld angelegt wird und dann das Produkt.

Hm ja, das hatte ich bisher noch nicht einbauen müssen bei mir.

Du meinst die Inhalte werden geladen, wenn du erst dein Plugin installierst (und damit das custom_field_set angelegt wird) und anschließend ein neues Produkt anlegst?

Das ergäbe für mich wenig Sinn, da das ja eigentlich Daten innerhalb des Produktes sind. Auch war das bei meinen Bestellungs-Feldern nicht das Problem. Sie wurden mir in der Administration auf jeden Fall auch für bereits angelegte Bestellungen angezeigt, waren aber natürlich unbefüllt.

Hast du mal ein administration:build nach der Plugin Installation gemacht und den Cache geleert? Meiner Erfahrung nach ist das etwas zickig mit Änderungen.

Die Felder werden in der Administration richtig angezeigt, ich brauche Sie aber z.B. auf der Produktdetailseite. Dort werden die irgendwie nur unter bestimmten Umständen geladen, was ich aber umgehen konnte indem ich im ProductsLoaded-Event die Felder selbst lade und zuweise. Hat auch den Vorteil dass ich Vererbung bei Produktvarianten berücksichtigen kann.

Ah ja, das habe ich inzwischen auch festgestellt, dass man eigene Erweiterungen manuell laden muss.
Es gibt zwar den Flag „autoload“ den man auf true setzen kann, aber der verändert nichts.

Aber dann scheint ja alles gut geklappt zu haben :slight_smile:

Kannst du mir auch sagen wie man den Payload eines order-line-item im Admin Bereich abfrage? Das Ausgeben funktioniert wohl, aber aber Abfragen habe ich lange versucht aber funktioniert nicht. So z.B.:

  {% if item.payload.customizationText is defined %}    
...

Der Ausdruck ergibt wohl immer false, obwohl ich genau das Feld an der Stelle ausgeben kann. Die dump() funktion ist im Admin Bereich auch nicht vorhanden.

Arbeitest du im Admin Bereich nicht eher mit zB

<sw-card-view> oder <sw-card>

Dort kann man normalerweise ein v-if verwenden.

Beispielsweise:

<sw-card-view>
    <sw-card>
        // immer angezeigt
    </sw-card>
    <sw-card v-if="item.payload.customizationText">
        // abhängige anzeige
    </sw-card>
</sw-card-view>

Mit {% if item.payload.customizationText is defined %} habe ich in der admin view nie gearbeitet. Die einzigen {% %} Elemente sind die Blockdefinitionen.

Das Topic ist zwar schon etwas älter aber ich hatte mit dem gleichen Problem zu Kämpfen. Sobald das Custom Field angelegt war z.b. bei Plugin Aktivierung haben wir bei erneuter Plugin Aktivierung einen Fehler erhalten das es bereits existiert. Die Option das Customfield vei deaktivieren zu löschen war für uns nicht realisierbar da wir dann daten verlieren. Daher haben wir beim anlegen des Custom Fields noch eine ID des existierenden customFields mitgegeeben und falls es nicht existiert null.

Die Methode für das holen der ID

private function getExistingUuidForCustomField($name){
        $customFieldRepository = $this->container->get('custom_field.repository');
        $context = Context::createDefaultContext();
        $criteria = new Criteria();
        $criteria->addFilter(new EqualsFilter('name', $name));
        $customField = $customFieldRepository->search($criteria, $context)->first();
        if ($customField !== null) {
            return $customField->getId();
        }
        return null;
    }

Das anlegen:

private function addCategoriesCustomFields(): void
    {
        $context = Context::createDefaultContext();
        $customFieldSetRepository = $this->container->get('custom_field_set.repository');
        $customFieldSetRepository->upsert([$this->getCategoriesCustomFields()], $context);
    }

private function getCategoriesCustomFields(): array
    {
        return [
            'name' => 'my_customfield_group',
            'config' => [
                'label' => [
                    'en-GB' => 'mycoolcustomfield Group',
                    'de-DE' => 'mycoolcustomfield Group'
                ]
            ],
            'customFields' => [
                [
                    'id' => $this->getExistingUuidForCustomField('mycoolcustomfield'),
                    'name' => 'mycoolcustomfield',
                    'type' => CustomFieldTypes::TEXT,
                    'config' => [
                        'label' => [
                            'en-GB' => 'foo',
                            'de-DE' => 'bar'
                        ],
                        'customFieldPosition' => 1
                    ]
                ]
            ],
            'relations' => [
                [ 'entityName' => 'category' ]
            ]
        ];
    }
1 „Gefällt mir“