Adding dynamic form components to forms

2008-03-19 Thread Eric Rotick
I would like to be able to create a form where the number and type of form
component is decided at run time.

I've done the research and found various guides, e.g
http://cwiki.apache.org/WICKET/forms-with-dynamic-elements.html but I've not
managed to crack it yet.

I've created some panels for the form components, one for a fieldset and one
for the form.

wicket:panel
input type=text wicket:id=textValue
/wicket:panel

wicket:panel
fieldset
legend wicket:id=setNamesetName/legend
table
tr wicket:id=eachEntry
td wicket:id=fieldNamefieldName/td
td wicket:id=fieldValuefieldValue/td
/tr
/table
/fieldset
/wicket:panel

wicket:panel
form wicket:id=SingleItemFormName
span wicket:id=SingleItemFormContents/
/form
/wicket:panel

When I use this

final Form form = new Form( SingleItemFormName );

for( Iterator views = display.getViews( ).iterator( ); views.hasNext( );
) {
IView view = (IView) views.next( );
form.add( new FieldSetView( SingleItemFormContents, readonly,
display, data, view )  );
}

add( form );

it works but only if there is one view. The reason is clear so I thought
this is the time to use a ListView. Note that I believe the code above shows
that the markup and panels are all working OK but the second time I use the
same id it barfs.

If I use this

final Form form = new Form( SingleItemFormName );

ListView contents = new ListView( SingleItemFormContents,
display.getViews( ) ) {
protected void populateItem( ListItem item ) {
IView view = (IView) item.getModelObject( );
item.add( new FieldSetView( view.getName( ), readonly, display,
data, view )  );
}
};
contents.setReuseItems( true );

form.add( contents );

add( form );

I get the error that components failed to render.

I've also tried

final Form form = new Form( SingleItemFormName );
add( form );

ListView contents = new ListView( SingleItemFormContents,
display.getViews( ) ) {
protected void populateItem( ListItem item ) {
IView view = (IView) item.getModelObject( );
item.add( new FieldSetView( view.getName( ), readonly, display,
data, view )  );
}
};
contents.setReuseItems( true );
add( contents );

form.add( contents );

and even

final Form form = new Form( SingleItemFormName );

WebMarkupContainer wmc = new WebMarkupContainer(
SingleItemFormContents );
for( Iterator views = display.getViews( ).iterator( ); views.hasNext( );
) {
IView view = (IView) views.next( );
wmc.add( new FieldSetView( view.getName( ), readonly, display, data,
view )  );
}
form.add( wmc );

but they all say that components failed to render.

What am I missing?

Thanks.


Re: Adding dynamic form components to forms

2008-03-19 Thread Igor Vaynberg
see http://herebebeasties.com/2007-08-17/wicket-bean-editor/
there is also a wicketstuff-crud project that does this...

-igor


On Wed, Mar 19, 2008 at 9:21 AM, Eric Rotick [EMAIL PROTECTED] wrote:
 I would like to be able to create a form where the number and type of form
  component is decided at run time.

  I've done the research and found various guides, e.g
  http://cwiki.apache.org/WICKET/forms-with-dynamic-elements.html but I've not
  managed to crack it yet.

  I've created some panels for the form components, one for a fieldset and one
  for the form.

  wicket:panel
  input type=text wicket:id=textValue
  /wicket:panel

  wicket:panel
  fieldset
 legend wicket:id=setNamesetName/legend
 table
 tr wicket:id=eachEntry
 td wicket:id=fieldNamefieldName/td
 td wicket:id=fieldValuefieldValue/td
 /tr
 /table
  /fieldset
  /wicket:panel

  wicket:panel
  form wicket:id=SingleItemFormName
 span wicket:id=SingleItemFormContents/
  /form
  /wicket:panel

  When I use this

 final Form form = new Form( SingleItemFormName );

 for( Iterator views = display.getViews( ).iterator( ); views.hasNext( );
  ) {
 IView view = (IView) views.next( );
 form.add( new FieldSetView( SingleItemFormContents, readonly,
  display, data, view )  );
 }

 add( form );

  it works but only if there is one view. The reason is clear so I thought
  this is the time to use a ListView. Note that I believe the code above shows
  that the markup and panels are all working OK but the second time I use the
  same id it barfs.

  If I use this

 final Form form = new Form( SingleItemFormName );

 ListView contents = new ListView( SingleItemFormContents,
  display.getViews( ) ) {
 protected void populateItem( ListItem item ) {
 IView view = (IView) item.getModelObject( );
 item.add( new FieldSetView( view.getName( ), readonly, display,
  data, view )  );
 }
 };
 contents.setReuseItems( true );

 form.add( contents );

 add( form );

  I get the error that components failed to render.

  I've also tried

 final Form form = new Form( SingleItemFormName );
 add( form );

 ListView contents = new ListView( SingleItemFormContents,
  display.getViews( ) ) {
 protected void populateItem( ListItem item ) {
 IView view = (IView) item.getModelObject( );
 item.add( new FieldSetView( view.getName( ), readonly, display,
  data, view )  );
 }
 };
 contents.setReuseItems( true );
 add( contents );

 form.add( contents );

  and even

 final Form form = new Form( SingleItemFormName );

 WebMarkupContainer wmc = new WebMarkupContainer(
  SingleItemFormContents );
 for( Iterator views = display.getViews( ).iterator( ); views.hasNext( );
  ) {
 IView view = (IView) views.next( );
 wmc.add( new FieldSetView( view.getName( ), readonly, display, data,
  view )  );
 }
 form.add( wmc );

  but they all say that components failed to render.

  What am I missing?

  Thanks.


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]