That's right. But the only consequence here is that he has to fill out
this (formerly invalid) field again.
I know that this is not the default intention of form behavior. But the
opposite of loosing all data
is much more expensive because 10% (maybe more) of willing customers buy
elsewhere then.
I do it only in a special case.
But thanks for the hint, Igor.
Mike
heh, this is a reallly bad idea.
suppose you have textfield<integer> and the user enters "a". that
would result in a conversion exception represented by the feedback
message - which you cleared. so when you call updatemodels() you will
get null set on the model...
-igor
On Fri, Aug 12, 2011 at 7:28 AM, Mike Mander<[email protected]> wrote:
With an annotation on my button i can go over the name cluttering issue
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface DirtySubmitter {
}
and in the form.onValidate
@Override
protected void onValidate() {
super.onValidate();
IFormSubmittingComponent button = findSubmittingButtonAllOver(this);
if (button != null&&
button.getClass().isAnnotationPresent(DirtySubmitter.class)) {
getSession().cleanupFeedbackMessages();
}
}
So this solution is a bit more reusable and flexible enough for me. All
works now.
Thanks for your great support.
Mike
onValidate seems a way to go. It leads to a not soo reusable solution like
your ReuseManager
but it works.
I simply override onConfigure in Form and did that
@Override
protected void onValidate() {
super.onValidate();
if
(findSubmittingButton().getInputName().equals("backToBasket")) {
getSession().cleanupFeedbackMessages();
}
}
because i use MultiForm and the child forms will be procceeded after the
parent i had to override onConfigure there to
@Override
protected void onValidate() {
super.onValidate();
IFormSubmittingComponent button =
findSubmittingButtonAllOver(this);
if (button != null&& button.getInputName().equals("backToBasket"))
{
getSession().cleanupFeedbackMessages();
}
}
findSubmittingButtonAllOver is a method in the base form i use
protected IFormSubmittingComponent findSubmittingButtonAllOver(Form<?>
form) {
if (form != null) {
IFormSubmittingComponent result = form.findSubmittingButton();
return result == null ?
findSubmittingButtonAllOver(findParent(Form.class)) : result;
}
return null;
}
Now i have to find a way to provide the inputname of submitting component.
Maybe an annotation to the "backToBasket" button is the solution here. But
for now the cluttering hard-coded button name is ok for me.
Thanks
Mike
I checked Form. There is an onValidate. Maybe i can clear the feedback
messages there.
Will try it.
But if wicket should support it out of the box there is maybe another
way.
If we could get a method onBeforeFormSubmit() in form there would be
an access point to configure validators in all childs.
In default nothing is to do - means leave form as configured at creation
time.
If it's nessecary i could set a flag or something to validate components
conditional.
Form.java
...
protected void onBeforeFormSubmit() {
if (findSubmittingButton.getId().equals("mySpecialButton")) {
setGlobalFlag(true);
} else {
setGlobalFlag(false);
}
}
and in Validator
MyValidator.java
void validate(IValidatable<T> validatable) {
if (!getGlobalFlag()) {
doValidation();
}
}
That would make it possibly unnessecary to store the component
references in session.
Or are there other usecases i don't see for ReuseManager.
AH.... not to say that I would mind if wicket would handle
reusemanager itself.. I wonder if it is there in 1.5? Hmm.. I think a
proposal should be added to the whishlist.
**
Martin
2011/8/12 Martin Makundi<[email protected]>:
The Form way is a quirk way to do it in the first place. You are not
supposed to update model before validation etc. so you will run into
lots of troubles that way.
Reusemanager simply works like wicket normally works when you validate
and repaint the screen with rawInput values. It just keeps those
components and copies the old rawInput value which was persisted
during incomplete submit.
**
Martin
2011/8/12 Mike Mander<[email protected]>:
Thanks Martin,
now it works as expected. I don't have a clue how but it is.
I really would be interested in knowing why the reusemanager gets the
data
and the form not.
I think i will start a debugging session at weekend :-)
Maybe we should use this scenario and put it in the wiki? Especially
in shop
environments it's
a big frustration point if form values is lost only because i want to
see
what i typed in last page.
And ask the user to provide all data until validation passes is
decreasing
the conversion rate :-(
So maybe others will benefit from the found / working solution to.
Thanks again
Mike
This is how you can do it with reusemanager:
HomePage:
public class HomePage extends WebPage {
public HomePage(final PageParameters parameters) {
Form<Void> form;
add(form = new Form<Void>("form"));
form.add(WicketSession.get().getReuseManager().rememberOrReuseAndProvideFeedback(HomePage.class.getSimpleName()
+ "tf", new TextField<String>("tf", Model.of(""))));
form.add(new Button("doMemorizeInvalidData") {
@Override
public void onSubmit() {
super.onSubmit();
setResponsePage(OtherPage.class);
setRedirect(true);
};
}.setDefaultFormProcessing(false));
form.add(new Button("doUpdateData") {
@Override
public void onSubmit() {
super.onSubmit();
setResponsePage(OtherPage.class);
setRedirect(true);
};
});
}
}
Reusemanager holder (can be session, can be something else):
public class WicketSession extends WebSession {
/**
*
*/
private static final long serialVersionUID = 1L;
private final FormComponentReuseManager reuseManager = new
FormComponentReuseManager();
public FormComponentReuseManager getReuseManager() {
return reuseManager;
}
/**
* @param request
*/
public WicketSession(Request request) {
super(request);
}
/**
* @return WicketSession
*/
public static WicketSession get() {
return (WicketSession) Session.get();
}
}
**
Martin
2011/8/12 Mike Mander<[email protected]>:
That is not working to. I've created a quickstart for this.
Scenario is simplified. HomePage gets the data and has two submit
buttons.
Do i press the "submit" and click back on other page data are
present
(submitted).
Do i press the "invalid submit" and click back on other page data
are
lost.
Here is the code
DirtyForm.java
<code>
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
public class DirtyForm<T> extends Form<T> {
public DirtyForm(String id, IModel<T> model) {
super(id, model);
}
public final void submitTheInvalidDataToMySession() {
//this seems not to be the complete solution
updateFormComponentModels();
}
}
</code>
HomePage.java
<code>
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;
public class HomePage extends WebPage {
public HomePage(final PageParameters parameters) {
DirtyForm<String> form;
add(form = new DirtyForm<String>("form", new
PropertyModel<String>(new PropertyModel<Object>(this, "session"),
"myBusinessValue"));
form.add(new TextField<String>("tf", form.getModel()));
form.add(new Button("doMemorizeInvalidData") {
@Override
public void onSubmit() {
super.onSubmit();
DirtyForm<?> f = findParent(DirtyForm.class);
f.submitTheInvalidDataToMySession();
setResponsePage(OtherPage.class);
setRedirect(true);
};
}.setDefaultFormProcessing(false));
form.add(new Button("doUpdateData") {
@Override
public void onSubmit() {
super.onSubmit();
setResponsePage(OtherPage.class);
setRedirect(true);
};
});
}
}
</code>
HomePage.html
<code>
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
<head>
<title>Wicket Quickstart Archetype Homepage</title>
</head>
<body>
<strong>Wicket Quickstart Archetype Homepage</strong>
<br/><br/>
<div>
<form wicket:id="form">
Value:
<input type="text" wicket:id="tf" />
<input type="submit" wicket:id="doMemorizeInvalidData"
value="invalid
submit" />
<input type="submit" wicket:id="doUpdateData" value="submit" />
</form>
</div>
</body>
</html>
</code>
MySession.java
<code>
import org.apache.wicket.Request;
import org.apache.wicket.protocol.http.WebSession;
public class MySession extends WebSession {
private String myBusinessValue = null;
public MySession(Request request) {
super(request);
}
public void setMyBusinessValue(String myBusinessValue) {
this.myBusinessValue = myBusinessValue;
}
public String getMyBusinessValue() {
return myBusinessValue;
}
}
</code>
OtherPage.java
<code>
import org.apache.wicket.markup.html.WebPage;
public class OtherPage extends WebPage {
public OtherPage() {
}
}
</code>
OtherPage.html
<code>
<html
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"
<head>
<title>Wicket Quickstart Archetype Homepage</title>
</head>
<body>
<strong>Wicket Quickstart Archetype Homepage</strong>
<br/><br/>
<a href="/">Back</a>
</body>
</html>
</code>
WicketApplication.java
<code>
import org.apache.wicket.Request;
import org.apache.wicket.Response;
import org.apache.wicket.Session;
import org.apache.wicket.protocol.http.WebApplication;
public class WicketApplication extends WebApplication {
@Override
public Class<HomePage> getHomePage() {
return HomePage.class;
}
@Override
public Session newSession(Request request, Response response) {
return new MySession(request);
}
}
</code>
In your GoBack button's submit method (dpf = false), call
form.updateFormComponentModels()
*Bruno Borges *
www.brunoborges.com.br
+55 21 76727099
On Thu, Aug 11, 2011 at 12:08 PM, Mike Mander<[email protected]>
wrote:
Am 11.08.2011 16:54, schrieb Bruno Borges:
You want to go back to another page without having to fill the
form,
but
you
also don't want to lose data you typed in in the previous
screen?
Seems
weird to me.
Have you considered to add Ajax update behaviour? onBlur of
components,
you
could update the model of each component.
*Bruno Borges*
www.brunoborges.com.br
+55 21 76727099
On Thu, Aug 11, 2011 at 11:50 AM, Mike
Mander<[email protected]>
wrote:
Am 11.08.2011 16:36, schrieb Bruno Borges:
Shouldn't you be submitting that button anyway? dfp = true
*Bruno Borges*
www.brunoborges.com.br
+55 21 76727099
On Thu, Aug 11, 2011 at 10:44 AM, Mike
Mander<[email protected]>
wrote:
Hi,
i've added a domain model globally to my session.
A form for editing this data is provided on page A. On this i
have
2
submit
buttons. One with setDefaultFormProcessing false (to previous
page)
and
one
with true (to next step).
If i press the main submit (next step | dfp = true) then
everything
works
as expected. If i press the other (previous page |dfp =
false) and
redirect
to Page A all data are lost. I'm absolutely aware of the
issue that
false
in
defaultFormProcessing is not submitting the data.
But because i cannot reproduce the input changed part of the
form
processing, i can't submit the invalid data manually. Is
there any
way
to
achieve my goal?
Thanks
Mike
------------------------------******--------------------------**--**
--**---------
To unsubscribe, e-mail:
users-unsubscribe@wicket.****apa**che.org<
http://apache.org**>
<users-unsubscribe@**wicket.**apache.org<http://wicket.apache.org><
users-unsubscribe@**wicket.apache.org<[email protected]>
For additional commands, e-mail: [email protected]
Then i can't goback to previous page without filling the
form.
The scenario is
1. goto basket
2. goto checkout (Page A in post) enter some data
3. goback to basket (dfp = false) validation should be bypassed
4. goto checkout => all entered data are present
But until now with this scenario i lost all data in step 4
Thanks
Mike
PS: I use buttons to stay in javascript-less mode :-)
------------------------------****----------------------------**
--**---------
To unsubscribe, e-mail:
users-unsubscribe@wicket.**apa**che.org<http://apache.org>
<users-unsubscribe@**wicket.apache.org<[email protected]>
For additional commands, e-mail: [email protected]
Ajax is not an option - i have to stay javascript-less.
You want to go back to another page without having to fill the
form,
but
you
also don't want to lose data you typed in in the previous
screen?
Seems
weird to me.
Not the previous screen. The current screen.
I come from basket. I goto checkout. I start typing. I think oops
what
was
the option in basket
and goback to basket (dfp = false). I check the basket option and
think
ok
let's go on checkout.
And on checkout i think - damn all typed data have gone. So i
leave the
shop.
That's the scenario i try to catch.
Thanks
Mike
------------------------------**------------------------------**---------
To unsubscribe, e-mail:
users-unsubscribe@wicket.**apache.org<[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]
---------------------------------------------------------------------
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]
---------------------------------------------------------------------
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]
---------------------------------------------------------------------
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]