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]

Reply via email to