I'm with you on this one, this code feels like doing something that it shouldn't, looks kind of bloated for such a simple and common requirement. Maybe we need some stuffing of nice, pre-canned FormValidators ? :)
The problem with wicket's validators, as I see it, is that they are at a Component level. They do their job based on that component's input/state, only. In fact, they are called in Form's validateComponents() one by one in a traversal. If another component's input or state is required to perform the validation, i'd do it inside a FormValidator. That copes with your requirement of "ignore the input for this component completely", although I don't know how would that be achieved. Of course, in all those comments, I assume you can not rely on javascript nor ajax to perform those validations, in which case the visibility approach simply couldn't work. Cheers, Xavier 2010/6/3 Iain Reddick <[email protected]> > The problem with this approach is that you throw away all the nice, > re-usable pre-canned validators that wicket has, and that it seems very > "wrong". > > I'd actually push the behaviour I would like to see even further - in the > example I gave, I don't even want the optional field to update it's model > when the check box isn't selected. > > Effectively, I want to be able to specify logic which says "ignore the > input for this component completely". Currently, the only way to do this is > by using component visibility (unless I'm completely wrong on this). > > Xavier López wrote: > >> Hi Iain, >> >> I would do it like this, with a FormValidator. I moved the minimum length >> validation also to the formValidator, because doing it with a >> MinimumLenghtValidator would trigger it before the formValidator executes, >> and may raise errors when the input is not valid (i.e. not mandatory) : >> >> private class TestForm extends Form { >> >> IModel modelAlways; >> IModel modelCheckOptional; >> IModel modelOptional; >> >> public TestForm(String id) { >> super(id); >> >> modelAlways = new Model(""); >> modelCheckOptional = Boolean.FALSE; >> modelOptional = new Model(""); >> final TextField alwaysTextfield = new TextField("always", modelAlways); >> alwaysTextField.setRequired(true); >> add(alwaysTextField); >> final CheckBox useOptionalCheck = new CheckBox( "useOptional", >> modelCheckOptional); >> add( useOptionalCheck ); >> final TextField optionalTextField = new TextField("optional", >> modelOptional); >> add(optionalTextField); >> >> add(new IFormValidator(){ >> protected FormComponent getDependentFormComponents(){ return null; } >> public boolean validate(Form f){ >> if (Boolean.TRUE.equals(useOptionalCheck.getConvertedInput()){ >> String optionalValue = >> optionalTextField.getConvertedInput(); >> if (Strings.isEmpty(optionalValue ){ >> error ("field optional is required"); >> } >> else if (optionalValue.length < 3){ >> error ("optional value's length must be at least 3); >> } >> }. >> } >> }); >> >> Cheers, >> Xavier >> >> 2010/6/2 Iain Reddick <[email protected]> >> >> >> >>> Here's some example code (wicket 1.3.x): >>> >>> Java: >>> >>> private class TestForm extends Form { >>> >>> private String always; >>> private boolean useOptional = false; >>> private String optional; >>> >>> public TestForm(String id) { >>> super(id); >>> >>> add( new TextField("always", new PropertyModel(this, >>> "always")).setRequired(true) ); >>> final CheckBox useOptionalCheck = new CheckBox( "useOptional", new >>> PropertyModel(this, "useOptional") ); >>> add( useOptionalCheck ); >>> add( new TextField("optional", new PropertyModel(this, "optional")) { >>> @Override >>> public boolean isRequired() { >>> return >>> ((Boolean)useOptionalCheck.getConvertedInput()).booleanValue(); >>> } >>> }.add(MinimumLengthValidator.minimumLength(3)) ); >>> } >>> >>> } >>> >>> Markup: >>> >>> <form wicket:id="testForm"> >>> <input wicket:id="always" type="text" /> >>> <input wicket:id="useOptional" type="checkbox" /> >>> <input wicket:id="optional" type="text" /> >>> <input type="submit" /> >>> </form> >>> >>> How can I express that I want the optional text field to only be used >>> when >>> the checkbox is selected? >>> >>> ----- Original Message ----- >>> From: "Igor Vaynberg" <[email protected]> >>> To: [email protected] >>> Sent: Wednesday, 2 June, 2010 4:00:57 PM >>> Subject: Re: Show/hide form components best practice >>> >>> if the form contains all the state then the answer is simple: write a >>> bit of javascript that does it for you. >>> >>> -igor >>> >>> On Wed, Jun 2, 2010 at 2:53 AM, Iain Reddick >>> <[email protected]> wrote: >>> >>> >>>> That's just a server round-trip on client-side state changem, which is >>>> basically (1) in my initial list. >>>> >>>> Basically, this type of form behaviour is very common and the question >>>> of how to implement it with Wicket has been raised by every developer >>>> I know >>>> who has worked with the framework. >>>> >>>> I know that Wicket generally works best when you round-trip >>>> client-side state changes to the server, but I think that in this >>>> situation it is silly, >>>> as the submitted form contains all the required state. >>>> >>>> Jeremy Thomerson wrote: >>>> >>>> >>>>> return true from wantOnSelectionChangedNotifications and put your >>>>> visibility changing code in onSelectionChanged >>>>> >>>>> >>>>> < >>>>> >>>>> >>>> >>> http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications()<http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications%28%29> >>> < >>> http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications%28%29 >>> > >>> >>> >>>> >>>>> >>>> >>> http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications()<http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications%28%29> >>> < >>> http://wicket.apache.org/docs/1.4/org/apache/wicket/markup/html/form/CheckGroup.html#wantOnSelectionChangedNotifications%28%29 >>> > >>> >>> >>> >>>> On Tue, Jun 1, 2010 at 5:37 AM, Iain Reddick >>>>> <[email protected]>wrote: >>>>> >>>>> >>>>> >>>>> >>>>>> Say I have a form with a check box that, when checked, shows some >>>>>> other field (i.e. it controls the visibility of other form >>>>>> components). >>>>>> >>>>>> What is the best approach to handling this? >>>>>> >>>>>> From what I understand, you have 3 options: >>>>>> >>>>>> 1. Add ajax behaviour to the check box (re-render relevant >>>>>> components). 2. Add javascript from the Java code (e.g. add some >>>>>> kind of show/hide >>>>>> behaviour). 3. Add javascript directly to the HTML. >>>>>> >>>>>> What are peoples experiences of the 3 methods, and which is best? >>>>>> >>>>>> --------------------------------------------------------------------- >>>>>> 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] > >
