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]

Reply via email to