Custom Fields + Set Relation in Plugin erstellen

Hallo,

 

Ich probiere gerade über ein Plugin custom Fields und ein custom Field set anzulegen.

Das klappt soweit mit folgendem Code:

 

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

$customFieldSetRepository->create([
    [
        'name' => 'my_test_logos',
        'config' => [
            'label' => [
                'de-DE' => 'Test Logos',
                'en-GB' => 'test logos'
                ]
            ],
        'customFields' => [
            [
                'name' => 'test_logo1_url',
                'type' => CustomFieldTypes::TEXT,
                'config' => [
                    'label' => [
                        'de-DE' => 'Artikel Logo 1',
                        'en-GB' => 'Article logo 1'
                    ],
                    'componentName' => "sw-media-field",
                    'customFieldType' => "media"
                ]
            ],
            [
                'name' => 'test_logo1_tooltip',
                'type' => CustomFieldTypes::TEXT
            ]
        ]
    ]
], $installContext->getContext());

 

Nun habe ich im Code herausgefunden, dass über einen Parameter “relations” eine custom_field_set_relation erzeugt werden kann.

 

Wie kriege ich es also nun (am besten mit Codebeispiel) hin, beim Erstellen dieses Custom Field Sets auch gleichzeitig eine Relation auf “product” zu erzeugen?

 

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

$customFieldSetRepository->create([
    [
        'name' => 'my_test_logos',
        'config' => [
            'label' => [
                'de-DE' => 'Test Logos',
                'en-GB' => 'test logos'
                ]
            ],
        'customFields' => [
            [
                'name' => 'test_logo1_url',
                'type' => CustomFieldTypes::TEXT,
                'config' => [
                    'label' => [
                        'de-DE' => 'Artikel Logo 1',
                        'en-GB' => 'Article logo 1'
                    ],
                    'componentName' => "sw-media-field",
                    'customFieldType' => "media"
                ]
            ],
            [
                'name' => 'test_logo1_tooltip',
                'type' => CustomFieldTypes::TEXT
            ]
        ],
        'relations' => [
            // was muss hier rein um eine relation zu "product" anzulegen?
        ]
    ]
], $installContext->getContext());

 

 

Vielen Dank im Voraus!

 

Grüße

Dennis

Hi Dennis,

der JSON-String sieht dann folgender Maßen zu aus:

 

{  
   "id":"b115ccb2e28c4465be04e634e5a39369",
   "name":"migration_tdztrz5656_product",
   "config":{  
      "label":{  
         "de-DE":"Product migration custom fields (attributes)"
      },
      "translated":true
   },
   "relations":[  
      {  
         "id":"9afdfcd84c5248e49d3ce176e6a91cc7",
         "entityName":"product"
      }
   ],
   "customFields":[  
      {  
         "id":"f0ecc93a01e74955840bd8e0d862418e",
         "name":"migration_tdztrz5656_product_attr2",
         "type":"text",
         "config":{  
            "componentName":"sw-field",
            "label":{  
               "de-DE":"Freitext-2"
            },
            "helpText":{  
               "de-DE":"Freitext zur Anzeige auf der Detailseite"
            },
            "customFieldPosition":2,
            "type":"text",
            "customFieldType":"text"
         }
      }
   ]
}

Somit bei dir dann in PHP:

'relations' => [
    [
       'id' => // eine UUID,
       'entityName' => 'product'
    ]
]

Hoffe das hilft dir.

Gruß

Krispin

3 Likes

Gibt es hierzu ein How To? Wo muss die JSON liegen? Was ist noch notwendig?

Hi mdsw,

die JSON habe ich nur dazu geschrieben, da dies genutzt werden kann um per JSON-API-Call die Daten zu erstellen.
Wenn man das in PHP macht, wie bei DenKon26, dann muss man daraus ein Array machen (wie auch in meiner Antwort beschrieben).
Hoffe das hilft dir weiter.

Gruß

Krispin

1 Like

Achso, das macht man also einfach wieder in der Lifecycle-Methode InstallContext. Einen CRUD-Service oder sowas gibt es nicht?!

Hi mdsw,

wenn man das über ein Plugin machen möchte, kann man das am Besten über das DAL machen.
Da muss man dann kein JSON oder ähnliches schreiben, sondern man erstellt das Object per Array und speichert seine Daten über das Repository (wie es DenKon26 auch gemacht hat). Siehe Doku: https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/data-abstraction-layer/write?category=shopware-platform-dev-en/internals/core/data-abstraction-layer

Gruß

Krispin

Hallo,

ich versuche grade via Plugin ein customField für die Entity „property_group“ zu erstellen. In der DB wird in den Tabellen custom_field_… alles korrekt angelegt bei der Installation des Plguins. Allerdings wird bei den Eigenschaften kein Zusatzfeld im Admin angezeigt.

Wenn ich die custom_field_set_relation testweise auf product mappe, wird in bei den Produkten das Zusatzfeld ausgegeben.

Kann mir jemand sagen, wie ich das Zusatzfeld bei dem Eigenschaften-Set reinbekomme?

Gruss,

Oliver

1 Like

@Liverson schrieb:

Hallo,

ich versuche grade via Plugin ein customField für die Entity „property_group“ zu erstellen. In der DB wird in den Tabellen custom_field_… alles korrekt angelegt bei der Installation des Plguins. Allerdings wird bei den Eigenschaften kein Zusatzfeld im Admin angezeigt.

Wenn ich die custom_field_set_relation testweise auf product mappe, wird in bei den Produkten das Zusatzfeld ausgegeben.

Kann mir jemand sagen, wie ich das Zusatzfeld bei dem Eigenschaften-Set reinbekomme?

Gruss,

Oliver

Hallo Zusammen,

habe das gleiche Problem wie Oliver. Versuche ein customField über den Code zu erstellen, jedoch bekomm ich es weder im ADM-Backend, noch beim Dump im der Storefront angezeigt. Das Feld existiert in der DB:

 

Ich hätte vermutet, dass es zumidest im Dump angezeigt wird:

Habe auch schon probiert das Feld dieser Doku Shopware 6: Add field to module in administration im Backend hinzuzufügen, allerdings weiß ich nicht wo es „einsortiert“ ist. Mein Versuch: „propertyGroup.translated.customFields.bit_optionVisible“:

Der „Switch“ wird angezeigt, jedoch lässt er sich nicht speichern. Daher vermute ich das die Feld-Zuordnung falsch ist. Eine Fehlermeldung in der Konsole erscheint nicht.

 

Kann mir hier jemand weiterhelfen, oder einen Tipp geben. Vielen Dank im voraus!

Mirco

Ich habe ähnliche Probleme. Vielleicht ist jemand so freundlich und stellt ein Beispiel zu Verfügung?!..

Weiß nicht, ob das jemandem hilft, aber hier mal ein komplettes Beispiel für die Plugin Installation:

<?php

declare(strict_types=1);

namespace MyPlugin;

use Shopware\Core\Framework\Plugin;
use Shopware\Core\Framework\Plugin\Context\InstallContext;
use Shopware\Core\System\CustomField\CustomFieldTypes;
use Shopware\Core\Framework\Uuid\Uuid;

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

        $customFieldSetRepository->create([
            [
                'name' => 'mp_custom_field_set',
                'config' => [
                    'label' => [
                        'de-DE' => 'Ein Label'
                    ]
                ],
                'customFields' => [
                    [
                        'name' => 'mp_custom_field_set_number',
                        'type' => CustomFieldTypes::FLOAT,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Ein Nummernfeld mit Zusatzoptionen'
                            ],
                            'type' => 'number',
                            'numberType' => 'float',
                            'customFieldType' => 'number',
                            'customFieldPosition' => 1,
                            'step' => 0.1,
                            'min' => 0,
                            'max' => 100
                        ]
                    ],
                    [
                        'name' => 'mp_custom_field_set_text',
                        'type' => CustomFieldTypes::TEXT,
                        'config' => [
                            'label' => [
                                'de-DE' => 'Ein Textfeld'
                            ],
                            'type' => 'text',
                            'customFieldType' => 'text',
                            'placeholder' => [
                                'de-DE' => 'Ein Platzhalter'
                            ],
                            'customFieldPosition' => 2
                        ]
                    ]
                ],
                'relations' => [
                    [
                        'id' => Uuid::randomHex(),
                        'entityName' => 'product'
                    ]
                ]
            ]
        ], $installContext->getContext());
    }
}

Die Zusatzoptionen lassen sich finde ich am einfachsten herausfinden, indem man sich ein Feld zusammenklickt und dann in der DB beim entsprechenden Eintrag in die config Spalte in der Tabelle custom_fields schaut. Hoffe es hilft.

Edit: Wenn jemand weiß, wie man die Sets dann wieder anständig löscht wäre ein Beispiel super. Ich würde das Repo mit einer Criteria auf name durchsuchen und die Matchings dann als Ids an delete übergeben. Gibt es da eine weniger umständliche Lösung?

Gib doch beim Erstellen gleich eine id an und verwende diese dann zum lösche

@trade Stimmt, danke dir! So wie ich das mittlerweile verstanden habe, kann man entweder eine ID mitgeben, oder diese Property weg lassen, dann übernimmt das DAL das Anlegen der ID. Das Erstellen wäre also auch so möglich:

...
    'relations' => [
        ['entityName' => 'product']
    ]
...