Konfiguracja pola wieloznacznego dla xtype zajmuje tylko jeden element (tzn. Można w nim umieścić jedno pole tekstowe, po skonfigurowaniu wielu wartości będą one przechowywane jako wielowartościowa właściwość o nazwie links, a gdy skonfigurowana zostanie tylko jedna wartość, będzie ona przechowywana jako własność o jednej wartości nazywana linkami). Całe dane skonfigurowane w twoim multifield będą przechowywane jako własność links w twoim węźle. Nie będziesz w stanie uzyskać ich jako "jcr: title" i "jcr: url".
Powinieneś utworzyć niestandardowy typ x powiedz "linksXtype", który przechowuje "jcr: title" i "jcr: url" jako pojedynczy ciąg oddzielony przez jakiś wzór powiedz "***" ("jcr: title *** jcr: url ").
można znaleźć szczegółowe informacje o tworzeniu niestandardowych xtype tutaj: link
xtype mogą być tworzone tak:
Ejst.CustomWidget = CQ.Ext.extend(CQ.form.CompositeField, {
/**
* @private
* @type CQ.Ext.form.TextField
*/
hiddenField: null,
/**
* @private
* @type CQ.Ext.form.ComboBox
*/
jcrtitle: null,
/**
* @private
* @type CQ.Ext.form.TextField
*/
jcrurl: null,
constructor: function(config) {
config = config || { };
var defaults = {
"border": false,
"layout": "table",
"columns":2
};
config = CQ.Util.applyDefaults(config, defaults);
Ejst.CustomWidget.superclass.constructor.call(this, config);
},
// overriding CQ.Ext.Component#initComponent
initComponent: function() {
Ejst.CustomWidget.superclass.initComponent.call(this);
this.hiddenField = new CQ.Ext.form.Hidden({
name: this.name
});
this.add(this.hiddenField);
this.jcrtitle = new CQ.Ext.form.TextField({
fieldLabel:"Jcr url",
cls:"ejst-customwidget-1",
listeners: {
change: {
scope:this,
fn:this.updateHidden
}
},
optionsProvider: this.optionsProvider
});
this.add(this.jcrtitle);
this.jcrurl = new CQ.Ext.form.TextField({
fieldLabel:"Jcr Title",
cls:"ejst-customwidget-2",
listeners: {
change: {
scope:this,
fn:this.updateHidden
}
}
});
this.add(this.jcrurl);
},
// overriding CQ.form.CompositeField#setValue
setValue: function(value) {
var parts = value.split("/");
this.jcrtitle.setValue(parts[0]);
this.jcrurl.setValue(parts[1]);
this.hiddenField.setValue(value);
},
// overriding CQ.form.CompositeField#getValue
getValue: function() {
return this.getRawValue();
},
// overriding CQ.form.CompositeField#getRawValue
getRawValue: function() {
return this.jcrtitle.getValue() + "***" +
this.jcrurl.getValue();
},
// private
updateHidden: function() {
this.hiddenField.setValue(this.getValue());
}
});
// register xtype
CQ.Ext.reg('linksXtype', Ejst.CustomWidget);
Zmiana dialog.xml aby coś takiego
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="cq:Dialog"
title="dialog"
xtype="dialog">
<items jcr:primaryType="cq:WidgetCollection">
<links
jcr:primaryType="cq:Widget"
fieldLabel="QuickLinks"
name="./links"
xtype="multifield">
<fieldConfig
jcr:primaryType="cq:Widget"
xtype="linksXtype">
</fieldConfig>
</links>
</items>
</jcr:root>
Aby pobrać wartości, należy powtórzyć iterację po tablicy ciągów zapisanej jako właściwość links i podzielić każdy ciąg przez "***"
EDIT:
usługi doradcze Adobe pod swoim pakiecie ACS-Commons zapewnia bardziej eleganckie multifieldpanel widget do obsługi tego przypadku użycia. Upraszcza to podejście i eliminuje potrzebę pisania niestandardowego xtype dla każdej kombinacji wymaganych pól. Dane są przechowywane w formacie JSON i dostarczane są z taglibsem do wyodrębniania danych z węzła. Link: http://adobe-consulting-services.github.io/acs-aem-commons/features/widgets.html#multi-field-panel-since-150
Dzięki. Chciałem tylko wyjaśnić, że jestem w stanie odczytać moje dane jako "jcr: title" i "jcr: url". Proszę zobaczyć link tutaj [http://pbrd.co/1vT2L4H] (http://pbrd.co/1vT2L4H). Problem polega na tym, że komponenty pola tekstowego nie są w stanie odczytać tych wartości i wypełnić w oknie dialogowym podczas próby edycji. – jpr
Jedyną wadą polegającą na łączeniu wartości jest to, że możesz mieć problemy z takimi rzeczami jak tworzenie kopii na żywo - np. jeśli twoja struktura witryny ma 'es' jako żywą kopię' en', zwykle ścieżki będą aktualizować tę ścieżkę automatycznie po wdrożeniu, ale myślę, że ma problem z połączonymi polami, ponieważ traktuje cały kompozyt jako proste pole tekstowe. – anotherdave
@jpr Wartości mogą zostać zapisane, ale nie sądzę, że będą działać tak, jak chcesz, po wyjęciu z pudełka. Jeśli sprawdzisz kod dla multifield, doda elementy xtype wspomniane w węźle konfiguracji pola. Tak więc po otwarciu okna dialogowego właściwość przechowywana z nazwą podaną w międzyczasie jest iterowana i ustawiana dla każdego przedmiotu w międzyczasie. Przy obecnej konfiguracji wartości nie są przechowywane w postaci oczekiwanej przez kod multifielda. Będziesz musiał stworzyć niestandardowe xtypes AFAIK. –