dependsOn: Constraint para dependência entre campos
12/02/2011 00:00
1
Havia criado uma constraint para validação de telefone (telefone:[dddField:'ddd']) e acabei fazendo algo genérico para dependência de preenchimento.

O cenário é o seguinte: dado dois campos não obrigatórios de preenchimento para a conclusão de um cadastro, porém caso um seja informado, o outro campo deve ser obrigatoriamente preenchido, o sistema não deve permitir o cadastro.

Segue o código! o/
A constraint:

package com.minhaapp.constraints

import java.util.Map;

import org.codehaus.groovy.grails.validation.AbstractConstraint
import org.springframework.validation.Errors

class DependsOnConstraint extends AbstractConstraint {
private static final String DEFAULT_MESSAGE_CODE = "default.dependson.null.message";
public static final String DEPENDS_ON_CONSTRAINT = "dependsOn";

private String field = null;
private String errorMessageCode = null;

public void setParameter(Object constraintParameter) {
if(!(constraintParameter instanceof Map))
throw new IllegalArgumentException("Parameter for constraint ["
+DEPENDS_ON_CONSTRAINT+"] of property ["
+constraintPropertyName+"] of class ["
+constraintOwningClass+"] must be a map with keys 'field' and 'errorMessageCode'");

this.field = constraintParameter.get('field', null)
this.errorMessageCode = constraintParameter.get('errorMessageCode', null)
super.setParameter(constraintParameter);
}

protected void processValidate(Object target, Object propertyValue, Errors errors) {
if(propertyValue && !target."$field"){
constraintPropertyName = field;
def args = (Object[]) [field, constraintOwningClass,
propertyValue]
if(this.errorMessageCode){
super.rejectValue(target, errors, this.errorMessageCode,
"not." + DEPENDS_ON_CONSTRAINT, args);
}else{
super.rejectValue(target, errors, DEFAULT_MESSAGE_CODE,
"not." + DEPENDS_ON_CONSTRAINT, args);
}
}
}

boolean supports(Class type) {
// any type
return true;
}

String getName() {
return DEPENDS_ON_CONSTRAINT;
}
}


No Config.groovy:

import org.codehaus.groovy.grails.validation.ConstrainedProperty;
import com.minhaapp.constraints.*;

ConstrainedProperty.registerNewConstraint(DependsOnConstraint.DEPENDS_ON_CONSTRAINT, DependsOnConstraint.class)


Exemplo de utilização, caso o ddd do celular seja informado, obrigatoriamente o telefone celular deve ser informado:

static constraints = {
dddTelefoneCelular(nullable:true, blank: true, size:2, dependsOn:[field:'numeroTelefoneCelular', errorMessageCode:'minhaentidade.telefone.celular.obrigatorio'])
}

i18n:

minhaentidade.telefone.celular.obrigatorio=O telefone celular deve ser informado



é isso aew o/

OBS.: nessa implementação o campo que ficará com erro de preenchimento é o que não está preenchido, no caso, no campo de telefoneCelular, mesmo a validação sendo a partir do campo ddd.
Tags: Snippets


Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto