I realize my last post was a mess so here is an attempt to summarize it:
I'm trying to turn
<input wicket:id="name"/>
which renders as
<input name="name" id="some_generated_wicked_id"/>
to something that will render like this:
<label for="generated_id">label</label> * <-FormComponentLabel*
<input name="name" id="generated_id"/>* <-Original FormComponent*
<div></div> *<-ComponentFeedbackPanel*
I managed to accomplish this using a panel, but its still not perfect.
Here is what I have so far:
The panel code:
public class FormComponentLabelAndFeedbackWrapper<T> extends Panel {
public static final String COMP_ID = "comp";
public FormComponentLabelAndFeedbackWrapper(String id, FormComponent<T>
comp) {
super(id);
if (!COMP_ID.equals(comp.getId())) {
throw new IllegalArgumentException("formcomponent id must be " +
COMP_ID);
}
setDefaultModel(comp.getModel());
add(new FormComponentLabel("compLabel", comp));
add(comp);
add(new ComponentFeedbackPanel("compFeedback", comp));
}
@Override
protected void onComponentTag(ComponentTag tag) {
tag.setName("div");
super.onComponentTag(tag);
}
}
Associated markup:
<wicket:panel>
<label wicket:id="compLabel">[label for]</label>
<input wicket:id="comp"></input>
<div wicket:id="compFeedback">[feedback for comp]</div>
</wicket:panel>
example of use in code:
form.add(new FormComponentLabelAndFeedbackWrapper<String>("name", new
TextField<String>(FormComponentLabelAndFeedbackWrapper.COMP_ID, new
PropertyModel<String>(user, "firstName"))));
The problem is that I can only use form components that are related to
<input> tag because if I use <wicket:container> instead of <input> the form
component onComponentTag will throw an exception when checking the tag.
-Is there anyway to somehow use <wicket:container> and change the tag
somehow before the form component onComponentTag method is called?
-This feels kind of hacky, can anyone suggest another method to achieve the
original goal?