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):