Werte einer aus einer MediaSelection werden nicht korrekt abgespeichert

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 Frontend nacheinander abgespielt werden. Für die Bilder habe ich die das  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 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 Details der Bildersequenz und klick nun auf Cancel und daraufhin im Shopping World Designer Fenster auf Save shopping world dann landet in der DB unter  s_emotion_element_value.value der Wert Array im  image_sequence Feld

Die Werte werden bei einem Cancel nicht wieder zum JSON String enkodiert. Wie kann ich sicherstellen, dass bei einem Schließen 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). 

Korrekt :

 

Falsch (value ist kein JSON String):

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. 

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

Viele Grüße
Miron

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