Hi Yoann,
there is actually an ongoing discussion about this problem:
https://issues.apache.org/jira/browse/WICKET-6041 Feel free to dive into
it and express your opinion.
Andrea.
Hi all,
My team is in the process of converting one of our projects to Wicket
7 (7.1.0, exactly). Unfortunately, we think we're having a blocking
issue, due to the fact that Form.wantSubmitOnNestedFormSubmit() turned
protected. It seems that with this method gone from the public API,
there is now no way of knowing which form was submitted in a given
(ajax) request.
Here follows the detailed explanation of the problem, and below
several potential fixes. Any comment would be greatly appreciated.
First, our use case : we've got a listener on our Ajax calls that adds
some CSS on components whenever a FormComponent inside them has been
submitted and was deemed invalid. For several reasons, when doing
this, we need to refresh the Form that was effectively submitted.
That's were we've got a problem... It seems that
AjaxFormSubmitBehavior, when submitting a *nested* form, will not mark
the nested form as submitted, but the *root* form :
@Override
protected void onEvent(final AjaxRequestTarget target)
{
getForm()*.getRootForm()*.onFormSubmitted(new
AjaxFormSubmitter(this, target));
}
Please note the use of Form.getRootForm(), which puts us in trouble.
It means that some metadata will be set on the root form and any
nested form, resulting in Form.isSubmitted() returning true for any
form. Hence, unless I missed something, no public API in Wicket allows
us to know which form was submitted anymore.
I say "anymore", because we previously used the same workaround as in
Form.findFormToProcess :
private Form<?> findFormToProcess(IFormSubmitter submitter)
{
// [... some code, irrelevant in our case ...]
final Form<?> targetedForm = submitter.getForm();
// [... some code, irrelevant in our case ...]
Form<?> formThatWantsToBeSubmitted = targetedForm;
Form<?> current = targetedForm.findParent(Form.class);
while (current != null)
{
if (current.*wantSubmitOnNestedFormSubmit()*)
{
formThatWantsToBeSubmitted = current;
}
current = current.findParent(Form.class);
}
return formThatWantsToBeSubmitted;
}
Since it is a private method, we had to copy/paste the code. But we
can't even do that anymore, because
Form.wantSubmitOnNestedFormSubmit() is now protected.
It seems to me that, in order to fix this issue, we've got several
options :
1. Make Form.wantSubmitOnNestedFormSubmit() public again, so we can at
least reproduce the findFormToProcess() method in an application.
2. Make Form.findFormToProcess() public, so that we can use it directly
in an application.
3. Make AjaxFormSubmitBehavior.onEvent() call Form.onFormSubmitted on
the form that was actually submitted, and not the root form, so that
we can simply use Form.isSubmitted() in an application.
Regards,