You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@cocoon.apache.org by Jeremy Quinn <je...@apache.org> on 2005/05/25 19:50:31 UTC
CForms : multivaluefield
Hi All,
I am using a multivaluefield and I am having strange effects.
I have a form to edit a Bean. The Bean has an ArrayList which is
populated with a bunch of Strings. The form displays this ArrayList
in a multivaluefield, which has all entries initially selected by
having identical items in both the selectionlist and the Bean. You
use the Form to deselect some of the entries.
I found that I was getting deselected (and sometimes duplicated)
entries in the Bean after the form had been used.
What appears to be happening, is that when
o.a.c.forms.bindingMultiValueJXPathBinding calls
multiValueContext.removeAll(this.rowPath), not all entries are removed.
I started with a Bean that had 4 items in it's ArrayList.
I counted the items in the ArrayList either side of the call to
removeAll :
multiValueContext.getValue("count(" + this.rowPath + ")");
The first time it is called it reports 4, after removeAll it reports 3.
In fact removeAll in this case only ever seems to remove one entry.
So the reason that this does not show up in the "form2_bind_bean"
CForms Sample, appears to be that it has only 2 items in the Bean to
start with and has validation to only allow 2 to be submitted.
Looking at
org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.removeAll I
do not see any obvious reasons why it is not working.
Any suggestions anyone ?
Can anyone else replicate this problem ?
Or am I barking up the wrong tree ?
regards Jeremy
Re: CForms : multivaluefield
Posted by Jeremy Quinn <je...@apache.org>.
Hi Guys
I really think I have a bug ..... but before I escalate this, could
someone give me a sanity check ?
I have a bunch of Strings in an ArrayList in provider.resourceList :
function addInstrument(form) {
. . .
var unit = {
resources:provider.resourceList,
. . .
};
form.load(unit);
form.showForm(screen, {resources:getSimpleSelectionList
(provider.resourceList)});
form.save(unit);
. . .
}
// make a Selection List from a List of Strings
function getSimpleSelectionList(list) {
var out = new Array(list.size());
for (var i = 0; i < list.size(); i++) out[i] = {value: list.get
(i)};
return out;
}
Model:
<fd:multivaluefield id="resources">
<fd:label><i18n:text
i18n:catalogue="editor">instrument.resources.label</i18n:text></
fd:label>
<fd:datatype base="string"/>
<fd:validation><fd:value-count min="1"/></fd:validation>
<fd:selection-list type="flow-jxpath" list-path="resources"
value-path="value" label-path="value"/>
</fd:multivaluefield>
Binding :
<fb:multi-value id="resources" parent-path="." row-
path="resources" direction="both"/>
Template :
<ft:widget id="resources"><fi:styling list-type="checkbox"/></
ft:widget>
So, you start off with a form with a list of Checkboxes, all selected.
eg.
X Item One
X Item Two
X Item Three
You uncheck Items Two and Three, your resulting list contains Item
One, Item Two.
Instead if you uncheck One and Two, your resulting list contains Item
Three, Item Two.
Instead you uncheck One and Three, your resulting list contains Item
Two, Item Two.
Is this as broken as it seems? Or have I done something stupid with
my binding (etc.) ?
Thanks for any suggestions.
regards Jeremy
On 25 May 2005, at 18:50, Jeremy Quinn wrote:
> Hi All,
>
> I am using a multivaluefield and I am having strange effects.
>
> I have a form to edit a Bean. The Bean has an ArrayList which is
> populated with a bunch of Strings. The form displays this ArrayList
> in a multivaluefield, which has all entries initially selected by
> having identical items in both the selectionlist and the Bean. You
> use the Form to deselect some of the entries.
>
> I found that I was getting deselected (and sometimes duplicated)
> entries in the Bean after the form had been used.
>
>
> What appears to be happening, is that when
> o.a.c.forms.bindingMultiValueJXPathBinding calls
> multiValueContext.removeAll(this.rowPath), not all entries are
> removed.
>
> I started with a Bean that had 4 items in it's ArrayList.
>
> I counted the items in the ArrayList either side of the call to
> removeAll :
>
> multiValueContext.getValue("count(" + this.rowPath + ")");
>
> The first time it is called it reports 4, after removeAll it
> reports 3.
>
> In fact removeAll in this case only ever seems to remove one entry.
> So the reason that this does not show up in the "form2_bind_bean"
> CForms Sample, appears to be that it has only 2 items in the Bean
> to start with and has validation to only allow 2 to be submitted.
>
> Looking at
> org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.removeAll I
> do not see any obvious reasons why it is not working.
>
>
> Any suggestions anyone ?
>
> Can anyone else replicate this problem ?
>
> Or am I barking up the wrong tree ?
>
>
> regards Jeremy
>
>
>