Search code examples
validationparsley.jsparsley

parsleyjs custom validator with computed message


I have a set of predefined rules which is loaded with a rest call from an external resource.

rules.yaml

rules:
  firstname:
    rule: value.length <= params.max
    message: Bitte geben Sie nicht mehr als {{params.max}} Zeichen ein
    params:
      max: 20
  lastname:
    rule: value.length <= params.max
    message: Bitte geben Sie nicht mehr als {{params.max}} Zeichen ein
    params:
      max: 30

Then i wrote a custom validator like this:

window.Parsley.addValidator('rules', {
    rules: rules,
    validateString: function (value, requirement) {
        let constraint = rules[requirement];
        if (constraint) {
            let params = constraint.params;
            if (constraint.message) {
                let errorMessage = Mustache.render(constraint.message, {params: params, value: value});
            }
            return !value || eval(constraint.rule);
        } else {
            console.log('Invalid constraint: $requirement could not be found inside $rules');
            return false;
        }
    },
    requirementType: 'string',
    messages: {
        en: 'The string ist invalid %s.',
        fr: 'Ce nombre n\'est pas un multiple de %s.'
    }
});

Validation works as expected. But as you can see, the error message is dynamically computed during validation. How can Parsley use my computed message in this setup?


Solution

  • Instead of true or false, you can return a failed promise with the argument being the error message.

    return $.Deferred().reject('Custom error message')