It must be manhandled. I am not sure though, if it can be automated. A wizard is almost like that, but again, you canot assume all user interactions to be same. However, it would be nice to maybe register components to a conversation-scoped reuseManager instead of handling all that on a case-by-case basis.
** Martin 2011/8/12 Bruno Borges <[email protected]>: > I don't think so. > > Its nature already provides that. > > Just keep an object instantiated somewhere. > > *Bruno Borges* > www.brunoborges.com.br > +55 21 76727099 > > > > On Fri, Aug 12, 2011 at 10:21 AM, Martin Makundi < > [email protected]> wrote: > >> I think wicket needs some sort of "conversation" scope like Seam >> does... that should cover it. >> >> ** >> Martin >> >> 2011/8/12 Mike Mander <[email protected]>: >> > 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]
