# Werte einer aus einer MediaSelection werden nicht korrekt abgespeichert

**URL:** https://forum.shopware.com/t/werte-einer-aus-einer-mediaselection-werden-nicht-korrekt-abgespeichert/58538
**Category:** Programmierung
**Tags:** shopping-worlds
**Created:** [13. März 2019 um 09:32 UTC](https://forum.shopware.com/t/werte-einer-aus-einer-mediaselection-werden-nicht-korrekt-abgespeichert/58538 "2019-03-13T09:32:10Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![kreativrudel](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/kreativrudel/32/14503_2.png) [@kreativrudel](https://forum.shopware.com/u/kreativrudel)
#### Post date: [13. März 2019 um 09:32 UTC](https://forum.shopware.com/t/werte-einer-aus-einer-mediaselection-werden-nicht-korrekt-abgespeichert/58538/1 "2019-03-13T09:32:10Z")

</div>

Hallo zusammen,

ich stehe vor einem Problem, bei dem ich ohne die Community wahrscheinlich nicht weiterkomme.

Zu meinem Problem:

Ich baue gerade ein Custom shopping world element welches eine Bildersequenz festhält. Die Bilder sollen im&nbsp;Frontend nacheinander abgespielt werden. Für die Bilder habe ich die das&nbsp; **Shopware.form.field.MediaSelection** Feld benutzt. Hierbei habe ich mich an der **banner\_slider** Komponente orientiert. Das Model und den Store habe ich meinen Anforderungen entsprechend angepasst.

Für das abspeichern des generierten JSON strings für die Bilder benutze&nbsp;ich ein hidden Field:

```
 ... $element-\>createHiddenField( ['name' =\> 'image\_sequence', 'fieldLabel' =\> sprintf( 'Image sequence' ), 'allowBlank' =\> true, 'valueType' =\> 'json'] ); ...

```

Meine Bildersequenz Komponente ist also identisch zu der **banner\_slider** Komponente außer an folgenden ExtJS Methoden:

```
Ext.define('Shopware.apps.Emotion.view.components.ImageSequence', {
// ...

initComponent: function () {
        var me = this;
        // ...
        // das zuvor erstellte hidden field zwischen speichern
        me.keyfeaturesStoreField = Ext.ComponentQuery.query('[name=image_sequence]', me)[0],
        // ...
        
},

refreshHiddenValue: function() {
        var me = this,
            store = me.imageSequenceStore,
            cache = [];

        store.each(function(item) {
            cache.push(item.data);
        });

        var record = me.getSettings('record');
        record.set('mapping', cache);
        
        // JSON string zum speichern vorbereiten und im hidden field hinterlegen
        me.imageSequenceStoreField.setValue(Ext.JSON.encode(cache));
    },
// ...
getGridData: function() {
        var me = this,
            elementStore = me.getSettings('record').get('data'),
            imageSequence;

        Ext.each(elementStore, function(element) {
            if(element.key === 'image_sequence') {
                if (element.value && element.value !== '') {

                    // JSON String wieder decoden
                    element.value = Ext.JSON.decode(element.value);
                }

                imageSequence = element;
            }
        });

        if(imageSequence && imageSequence.value) {
            Ext.each(imageSequence.value, function(item) {

                me.imageSequenceStore.add(Ext.create('Shopware.apps.Emotion.model.ImageSequence', item));
            });
        }
    },
// ...

```

- Klickt man nun im Custom element Detail Fenster auf **Save** und im Shopping World Designer Fenster auf **Save shopping world** dann klappt alles ohne Probleme
- Öffnet man nun wieder die Custom element&nbsp;Details der Bildersequenz und klick nun auf **Cancel** und daraufhin im&nbsp;Shopping World Designer Fenster auf **Save shopping world** dann landet in der DB unter&nbsp; **s\_emotion\_element\_value.value** der Wert **Array** im&nbsp; **image\_sequence** Feld

Die Werte werden bei einem **Cancel** nicht wieder zum JSON String enkodiert. Wie kann ich sicherstellen, dass bei einem Schließen&nbsp;des Custom Elements Fensters die Werte wieder Enkodiert werden ? Ich habe es bereits mit einem **me.onDestroy** Event versucht aber das hat leider auch nicht zum gewünschten Ergebnis geführt.

Hier noch zwei Bilder die den Request festhalten. An denen kann man sehen, dass für **image\_sequence** ein JS Array übermittelt wird (zweites Bild).&nbsp;

**Korrekt** :

 ![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/a/ade94f89f06f285951fb1c7e8534d3135e410e39.png)

&nbsp;

**Falsch** (value ist kein JSON String):

 ![](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/2X/a/ac22783fa77a521feb8c78789abebdbf08b84734.png)

---

<div class="post-metadata">

### Author: ![kreativrudel](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/kreativrudel/32/14503_2.png) [@kreativrudel](https://forum.shopware.com/u/kreativrudel)
#### Post date: [13. März 2019 um 12:52 UTC](https://forum.shopware.com/t/werte-einer-aus-einer-mediaselection-werden-nicht-korrekt-abgespeichert/58538/2 "2019-03-13T12:52:24Z")

</div>

Ich habe es jetzt nur über einen äußerst hässlichen Hack gelöst:

```
 // ... initComponent: function () { var me = this; me.callParent(arguments); me.onDestroy = function() { this.fixJSONStuff(); } // ... }, fixJSONStuff: function() { var me = this; if (me.getSettings('record').get('data')) { Ext.Object.each(me.getSettings('record').get('data'), function(key, value) { if (value.valueType === 'json' && value.value && typeof value.value !== 'string') { me.getSettings('record').get('data')[key].value = Ext.JSON.encode(value.value); } }); } }, // ...

```

Bei jedem schließen der Detail Ansicht einer meiner Custom Component enkodiere ich alle Felder mit dem valueType = ‚json‘ zurück in einen String.&nbsp;

Für eine schönere Lösung oder sogar eine Beschreibung was ich falsch mache wäre ich sehr dankbar 🙂

Viele Grüße  
Miron

---

<div class="post-metadata">

### Author: ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)
#### Post date: [13. März 2019 um 14:56 UTC](https://forum.shopware.com/t/werte-einer-aus-einer-mediaselection-werden-nicht-korrekt-abgespeichert/58538/3 "2019-03-13T14:56:50Z")

</div>

Subscribe dich an die Change events und update das hidden feld. Ansonsten&nbsp;Ext.ComponentQuery.query sollte man **nie** verwenden
