keepUserData() und Custom Fields

Hallo, ich versuche mich kurz zu halten :wink:

Es geht um die Custom-Fields wie in dieser Doku: Shopware 6: Custom fields

 

Frage 1: Sollte man Custom Fields durch keepUserData() in der Uninstall Methode erhalten, oder macht man das eher nicht? Best Practice?

Frage 2: Durch den create -Befehl bei

$this->customFieldSetRepository->create($customFieldSets, $context); 

erhalte ich beim erneuten Installieren des Plugins den typischen “Duplicate entry” Fehler , da die Custom Fields bereits existieren.

 

$this->customFieldSetRepository->upsert($customFieldSets, $context);

wirft mir leider ebenfalls diesen Fehler - ich dachte eigentlich, dass upsert nur ein update durchführt, sollten diese Felder bereits existieren. Wie wird dies korrekt umgesetzt?

 

 

 

1 „Gefällt mir“

Hi @mdsw‍,

ich würde die Felder bei keepUserData auf alle Fälle behalten.

Wenn du die “create”-Methode benutzt, dann würde ich diese in einen try-catch Block setzten und bei der “Existiert schon”-Exception einfach nichts tun. 

Wenn du es mit upsert machst, musst du eine UUID angeben. Nur dann wird deine Entity angelegt, falls sie nicht vorhanden ist und ansonsten geupdated. Aus meiner Sicht, kannst du die UUID einfach hardcoded hinterlegen. In die UUID fließt unter anderem Zufallszahlen ein. Das es dieselbe UUID schon gibt ist sehr unwahrscheinlich https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions.

Viele Grüße

1 „Gefällt mir“

@simkli‍ vielen Dank für die Antwort. Prinzipiell würde es also ausreichen, einen try-catch-Block um den insert-Befehl zu legen.

UUIDs lege ich tatsächlich nicht an. Was passiert technisch denn dabei, wenn keine UUID hinterlegt wurde? Dann gibt es teilweise custom fields mit ID und welche ohne? Verstehe ich noch nicht ganz.

Was wäre die “bessere” Variante? try-catch ODER UUIDs hardcoded hinterlegen?

1 „Gefällt mir“

@simkli‍

hm… habe das nun getestet… vergebe ich eine UUID dem CustomField sowie auch dem CustomFieldSet, wird der Name bemängelt… 

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '\x835\xACd\xF1\xE4\x1  
  1\xEA\xAD\xC1\x02B\xAC\x12\x00\x01-category' for key 'uniq.custom_field_set_relation.entity_  
  name'     

// Edit: Es geht doch, wenn man der relation auch eine UUID vergibt.  Thumb-Up

1 „Gefällt mir“

@mdsw schrieb:

Was passiert technisch denn dabei, wenn keine UUID hinterlegt wurde? Dann gibt es teilweise custom fields mit ID und welche ohne?

Dann vergibt Shopware eine neue.  

Was wäre die „bessere“ Variante? try-catch ODER UUIDs hardcoded hinterlegen?

Ich würde sagen es macht keinen großen Unterschied. Wenn du die Customfelder später löschen oder ändern willst, musst du dir immer erst die neu generierte UUID holen (z.B. mit einem Filter auf name=DeinName). 

Aber eigentlich kann man beides machen, würde ich sagen. Vielleicht meldet sich ja noch jemand, der einen Nachteil von einer der Methoden kennt.

1 „Gefällt mir“

Entweder du vergibst immer die selben UUIDs damit ein upsert klappt oder du schaust einfach vorher ob sie existiert. 

2 „Gefällt mir“

Perfekt vielen Dank. Das läuft jetzt Halo