Thanks a lot for your answer Jan
the thing was that I missed the list in my union.
I did not understood that the choice of the "case" was made by a choice of
a value is the union list.
Now everything (if I missed these fd:action) works fine,
regards,
Stephane
Bitte antworten an [EMAIL PROTECTED]
An: [EMAIL PROTECTED]
Kopie:
Thema: Re: [cforms] struct and class display
Whenever you have a union widget, you need a case widget that holds the
id of the currently chosen unionpart (struct) in its valuefield. You
might understand it better with a little example:
Lets say you have some heterogeneous repeater, some fields may contain
input, other's just a value to show.
definition: (don't forget the fd:new id="myclass", I don't mention them
here explicitly, but you do want to create an instance of course)
<fd:class id="myclass">
<fd:widgets>
<!-- make sure to use a field widget with a selection list for
the 'case' widget of the following union -->
<fd:field id="input_type">
<fd:datatype base="string"/>
<fd:selection-list>
<fd:item value="no_input"> <!-- the value is the
id of a struct below, this will make that struct visible if chosen -->
<fd:label>No input</fd:label> <!-- label not
really needed if the select-widget isn't shown to user-->
</fd:item>
<fd:item value="input">
<fd:label>Input</fd:label>
</fd:item>
</fd:selection-list>
</fd:field>
<fd:union case="input_type" default="no_input"
id="input_union">
<fd:widgets>
<fd:struct id="no_input"> <!-- Notice the same
id as above in the selection, this struct will simply show the field-->
<fd:widgets>
<fd:output id="some_output_field">
<fd:datatype base="string"/>
</fd:output>
</fd:widgets>
</fd:struct>
<fd:struct id="input">
<fd:widgets>
<fd:field id="some_input_field"><!--
this will give an input field to change the value-->
<fd:datatype base="string"/>
</fd:field>
</fd:widgets>
</fd:struct>
</fd:widgets>
</fd:union>
</fd:widgets>
</fd:class>
your template may look like:
<ft:class id="myclass">
<ft:widget id="input_type"><fi:styling
type="hidden"/></ft:widget> <!-- I set the selection widget hidden, I
want the source xml document data to make the choice-->
<ft:union id="input_union">
<ft:case id="no_input">
<ft:struct id="no_input">
<ft:widget id="some_output_field"/> <!-- non
editable-->
</ft:case>
<ft:case id="input">
<ft:struct id="input">
<ft:widget id="some_input_id"/><!-- edit field-->
</ft:struct>
</ft:case>
</ft:union>
</ft:class>
let the binding field take care of the selection:
<fb:class id="myclass">
<fb:javascript id="input_type" path="." direction="load">
<fb:load-form>
var tmp = jxpathContext.getValue("@user_changable");
if (tmp != null)
{
var userChangable = new java.lang.String(tmp);
if (userChangable.equals("yes"))
{
widget.setValue("input");
} else {
widget.setValue("no_input");
}
}
</fb:load-form>
</fb:javascript>
<fb:union id="input_union" path=".">
<fb:case id="no_input" path=".">
<fb:struct id="no_input" path=".">
<fb:value id="some_output_field"/>
</fb:struct>
</fb:case>
<fb:case id="input" path=".">
<fb:struct id="input" path=".">
<fb:value id="some_input_field" path="."/>
</fb:struct>
</fb:case>
</fb:union>
</fb:class>
This may bind the xml data if you create a repeater which has an
instance of the class:
<some_list><!-- repeater parent path-->
<item user_changable="yes">valueA</item><!-- surround (for
this example) the fb:new with a fb:context path="item", so that the
class works on "item, @user_changable and the containing textnode-->
<item user_changable="no">valueB</item>
</some_list>
this will give an input field with valueA and an output field for valueB
Hope I minimized the typo's, it's a long bit of code ;-)
Kind Regards,
Jan
Stephane Delort wrote:
>Hi,
>
>
>
>well I can, now, access to the object in class, struct or union in my
> flowscript (see previous thread).
>
>
>
>but then, the shame is that it does not display the form and I have a
> "nullpointer exception" error instead.
>
>In my defintion file I have :
>
>******************************
> <...>
> <fd:widgets>
>
> <fd:union id="start" default="" case="widget-id">
> <fd:datatype base="string"/>
> <fd:widgets>
> <fd:new id="widgetClass"/>
> </fd:widgets>
> </fd:union>
>
> <fd:class id="widgetClass">
> <fd:widgets>
> <fd:repeater id="inList" >
> <fd:widgets>
> <fd:union id="union" case="widget-id">
> <fd:datatype base="string"/>
> <fd:widgets>
> <fd:struct id="simpleList">
> <fd:widgets>
> <fd:multivaluefield id="list">
>
><....>
>
>
>
>In fill the field thanks to the followwing flowscript :
>
>********************************************************
>.......
> var myRepeater = form.lookupWidget("start").lookupWidget("inList");
> var row = myRepeater.addRow();
> var myUnion = row.lookupWidget("union");
> var myDesiredStruct = myUnion.lookupWidget("simpleList");
> var myList = myDesiredStruct.lookupWidget("list");
> myList.setSelectionList( c, "listId", "label" ); //c is an ArrayList
(collection).
>
>....
>
>
>
>then, finally here is the *template file which get me into troubles *;
>
>*************************************************************************
><...>
> <ft:union id="start">
> <ft:case id="widgetClass"> // if I put this
block in comments, the form is not display but I do not have any exception
> <ft:new id="widgetClass"/>
> </ft:case>
> </ft:union>
>
> <ft:class id="widgetClass">
> <ft:repeater-widget id="inList">
> <ft:union id="union">
>
> <ft:case id="simpleList">
> <ft:struct id="simpleList">
> <ft:widget id="list">
> <fi:styling list-type="checkbox"/>
> </ft:widget>
> </ft:struct>
>
><...>
>
>
>
>Anyway, it appears that I can fill any field of any structure belonging to
> my union id="union" thanks to the lookupwidget function. So, in this
> case how doesthe union make the selection to know which structure is
> to be displayed ?
>
>
>
>
>
>Thanks in advance for any help,
>
>Stephane
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]