Here is my patch for form processing/refactored button. Its not polished
yet, but if it looks good to you guys I can polish it up.
Igor
-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Eelco
Hillenius
Sent: Tuesday, July 05, 2005 9:20 AM
To: [email protected]
Subject: Re: [Wicket-develop] [ wicket-Bugs-1220639 ] form processing could
be better defined
Yeah, send in your patches please. I had some ideas myself, so lets see what
our combined effort results in. Can apply tonight.
Eelco
Phil Kulak wrote:
haha, that's almost exactly what I was thinking. I actually added a
method to button called "validatesForm". It seems to work well with
this onValidate() method:
protected void onValidate()
{
final Button button = findSubmittingButton();
if (button == null)
{
validate();
}
else
{
if (button.validatesForm())
{
if (validate())
{
button.onSubmit();
}
}
else
{
button.onSubmit();
}
}
}
On 7/5/05, Igor Vaynberg <[EMAIL PROTECTED]> wrote:
When do you guys think this will be semi-finished in HEAD?
Here is the functionality im looking for:
I would like to be able to specify whether or not the form should
validate based on the submitting button and to have the button's
onsubmit handler called before the forms onsubmit handler.
For example:
Button can have a boolean validateForm() and a boolean onSubmit(), if
false is returned from the button's onSubmit() the form's onSubmit()
doesn't get called.
My usecase is a wizard. When the user presses the back button in the
wizard I would like to record the user's input and go back a step w/o
validation and onsubmit() being called.
If this is on par with what you guys had in mind I would be happy to
submit a patch.
Thanks,
Igor
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies from
IBM. Find simple to follow Roadmaps, straightforward articles, informative
Webcasts and more! Get everything you need to get up to speed, fast.
http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
Wicket-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/wicket-develop
------------------------------------------------------------------------
Index: src/java/wicket/markup/html/form/Button.java
===================================================================
RCS file: /cvsroot/wicket/wicket/src/java/wicket/markup/html/form/Button.java,v
retrieving revision 1.10
diff -u -r1.10 Button.java
--- src/java/wicket/markup/html/form/Button.java 25 Mar 2005 15:44:43
-0000 1.10
+++ src/java/wicket/markup/html/form/Button.java 5 Jul 2005 19:18:44
-0000
@@ -19,7 +19,6 @@
import wicket.WicketRuntimeException;
import wicket.markup.ComponentTag;
-import wicket.model.IModel;
import wicket.util.string.Strings;
import wicket.util.value.ValueMap;
@@ -28,7 +27,7 @@
*
* @author Jonathan Locke
*/
-public class Button extends FormComponent
+public class Button extends AbstractButton
{
/**
* @see wicket.Component#Component(String)
@@ -39,24 +38,6 @@
}
/**
- * @return Any onClick JavaScript that should be used
- */
- protected String getOnClickScript()
- {
- return null;
- }
-
- /**
- * @see wicket.Component#initModel()
- */
- protected IModel initModel()
- {
- // Buttons don't have models and so we don't want
- // Component.initModel() to try to attach one automatically.
- return null;
- }
-
- /**
* Processes the component tag.
*
* @param tag
@@ -87,30 +68,5 @@
{
throw new WicketRuntimeException("Button tag must have
non-empty value attribute");
}
-
- // Default handling for component tag
- super.onComponentTag(tag);
-
- // If the subclass specified javascript, use that
- final String onClickJavaScript = getOnClickScript();
- if (onClickJavaScript != null)
- {
- tag.put("onclick", onClickJavaScript);
- }
- }
-
- /**
- * Override this method to provide special submit handling in a
multi-button
- * form
- */
- protected void onSubmit()
- {
- }
-
- /**
- * @see wicket.markup.html.form.FormComponent#updateModel()
- */
- protected void updateModel()
- {
}
}
\ No newline at end of file
Index: src/java/wicket/markup/html/form/Form.java
===================================================================
RCS file: /cvsroot/wicket/wicket/src/java/wicket/markup/html/form/Form.java,v
retrieving revision 1.80
diff -u -r1.80 Form.java
--- src/java/wicket/markup/html/form/Form.java 30 Jun 2005 14:39:46 -0000
1.80
+++ src/java/wicket/markup/html/form/Form.java 5 Jul 2005 19:18:44 -0000
@@ -312,15 +312,36 @@
*
* Handles form submissions. By default, this method simply calls validate()
* to validate the form and update the model if there is only one
button. If
- * there is more than one button, it calls the onClick() method for the
+ * there is more than one button, it calls the onSubmit() method for the
* button which submitted the form.
*
* @see Form#validate()
*/
public void onFormSubmitted()
{
- // Validate form
- onValidate();
+ if (countButtons()>1) {
+ final AbstractButton button=findSubmittingButton();
+ if (button == null)
+ {
+ throw new WicketRuntimeException("Unable to find
submitting button");
+ }
+
+ boolean callOnSubmit=true;
+ if (button.validatesForm()) {
+ callOnSubmit=validate();
+ }
+ if (callOnSubmit) {
+ if (button.onSubmit()) {
+ onSubmit();
+ }
+ }
+ } else {
+ if (validate()) {
+ onSubmit();
+ }
+ }
+
+
}
/**
@@ -429,31 +450,6 @@
}
/**
- * Called when a form that has been submitted needs to be validated.
- */
- protected void onValidate()
- {
- // Validate the form
- if (validate())
- {
- // If there is more than one button, we also call the
Button's
- // onSubmit() handler
- if (countButtons() > 1)
- {
- final Button button = findSubmittingButton();
- if (button == null)
- {
- throw new WicketRuntimeException("Unable to
find submitting button");
- }
- else
- {
- button.onSubmit();
- }
- }
- }
- }
-
- /**
* Validates the form and updates the models of form components. If the
form
* validates successfully, handleValidSubmit() is called. If not,
* handleErrors() is called.
@@ -488,9 +484,6 @@
// Persist FormComponents if requested
persistFormComponentData();
- // Model was successfully updated with valid data
- onSubmit();
-
// Form validated
return true;
}
@@ -535,7 +528,7 @@
private int countButtons()
{
final Count count = new Count();
- visitChildren(Button.class, new IVisitor()
+ visitChildren(AbstractButton.class, new IVisitor()
{
public Object component(final Component component)
{
@@ -549,14 +542,14 @@
/**
* @return The button which submitted this form
*/
- private Button findSubmittingButton()
+ private AbstractButton findSubmittingButton()
{
- return (Button)visitChildren(Button.class, new IVisitor()
+ return (AbstractButton)visitChildren(AbstractButton.class, new
IVisitor()
{
public Object component(final Component component)
{
// Get button
- final Button button = (Button)component;
+ final AbstractButton button =
(AbstractButton)component;
// Check for button-name or button-name.x
request string
if (!Strings.isEmpty(button.getInput())
Index: src/java/wicket/markup/html/form/AbstractButton.java
===================================================================
RCS file: src/java/wicket/markup/html/form/AbstractButton.java
diff -N src/java/wicket/markup/html/form/AbstractButton.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ src/java/wicket/markup/html/form/AbstractButton.java 1 Jan 1970
00:00:00 -0000
@@ -0,0 +1,83 @@
+package wicket.markup.html.form;
+
+import wicket.markup.ComponentTag;
+import wicket.model.IModel;
+
+/**
+ * Base class for controls that submit a form.
+ *
+ * @author Igor Vaynberg [EMAIL PROTECTED]
+ *
+ */
+public abstract class AbstractButton extends FormComponent
+{
+ /**
+ * @see wicket.Component#Component(String)
+ */
+ public AbstractButton(String id)
+ {
+ super(id);
+ }
+
+ protected boolean validatesForm() {
+ return true;
+ }
+
+ /**
+ * @return Any onClick JavaScript that should be used
+ */
+ protected String getOnClickScript()
+ {
+ return null;
+ }
+
+ /**
+ * @see wicket.Component#initModel()
+ */
+ protected IModel initModel()
+ {
+ // Buttons don't have models and so we don't want
+ // Component.initModel() to try to attach one automatically.
+ return null;
+ }
+
+ /**
+ * Override this method to provide special submit handling in a
multi-button
+ * form.
+ * @return true to call form.onSubmit(), false otherwise
+ */
+ protected boolean onSubmit()
+ {
+ return true;
+ }
+
+ /**
+ * @see wicket.markup.html.form.FormComponent#updateModel()
+ */
+ protected void updateModel()
+ {
+ }
+
+
+ /**
+ * Processes the component tag.
+ *
+ * @param tag
+ * Tag to modify
+ * @see wicket.Component#onComponentTag(ComponentTag)
+ */
+ protected void onComponentTag(final ComponentTag tag)
+ {
+ // Default handling for component tag
+ super.onComponentTag(tag);
+
+ // If the subclass specified javascript, use that
+ final String onClickJavaScript = getOnClickScript();
+ if (onClickJavaScript != null)
+ {
+ tag.put("onclick", onClickJavaScript);
+ }
+ }
+
+
+}