Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for 
change notification.

The following page has been changed by AdriaanJoubert:
http://wiki.apache.org/tapestry/Tapestry5HowToAddValidators

New page:
Here is a short description how to add validators to Tapestry 5. Changes and 
corrections welcome.

First define a validation class. This validator does not take an argument (as 
in min=5 e.g.), so the first template parameter is `Void`. As no conversion to 
a specific type of the contents is required, use `Object` as the second 
parameter. 

The message-key is specified in the constructor, and is `validate-int`. The 
name of the validator function is `int` as specified in the 'addValidation' 
call in the `render` method.

A sample class is {{{
public class ValidateInt extends AbstractValidator<Void, Object> {

        public ValidateInt() {
                super(null, Object.class, "validate-int");
        }

        @Override
        public void render(Field field, Void constraintValue,
                        MessageFormatter formatter, MarkupWriter writer,
                        FormSupport formSupport) {
                formSupport.addValidation(field, "int", 
formatter.format(field.getLabel()), null);
        }

        @Override
        public void validate(Field field, Void constraintValue,
                        MessageFormatter formatter, Object value) throws 
ValidationException {
                if (value != null) {
                        try {
                                Integer.parseInt(value.toString());
                        } catch (NumberFormatException ex) {
                                throw new 
ValidationException(formatter.format(field.getLabel()));
                        }
                }
        }

}
}}}

Specify the message in a properties file, e.g. 
`org/example/ValidationMessages.properties` {{{
validate-int=You must provide a whole number for %s.
}}}

These need to be registered in `AppModule.java` for your application as 
follows:{{{
        public static void contributeFieldValidatorSource(
                        MappedConfiguration<String, Validator> configuration) {
                configuration.add("int", new ValidateInt());
        }

        public void contributeValidationMessagesSource(
                        Configuration<String> configuration) {
                configuration.add("org/example/ValidationMessages");
        }
}}}

Not done yet, as the javascript to do client-side validation is still required. 
Create a javascript file `validators.js` with e.g. {{{
Tapestry.Validator.int = function(field, message) {
        Tapestry.addValidator(field, true, function(value, event) {
                if (!Number(value) || value.indexOf(".")!=-1)
                        event.recordError(message);
         });
}
}}}

This javascript file needs to be included in all pages/components where the new 
validator is to be used (Is there a better way?)

Once this is done you can add the validator to your text fields as in 

{{{
<t:textfield t:id="select" value="selector" validate="required,int,min=0"/>
}}}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to