GF
Adicionando Validações em Formulários Dinâmicos
Fechado
Esse artigo abrange o Adianti Framework Web. Sendo assim, não o considere para aplicações GTK. Ele surgiu da necessidade de efetuar validações de acordo com as informações preenchidas num formulário. Se for do seu interesse desenvolver sistemas que permitam validações mais flexíveis e compatíveis com a dinâmica de um formulário, continue a leitura desse artigo.
Desde sua primeira versão, o Adianti Framework permite acrescentar validações utilizando o método addValidation() sobre o campo no qual deseja-se validar. Os argumentos do método são específicos ao tipo de validação a ser feito. De maneira geral, os parâmetros passados são:
• o nome para descrever o campo (exemplo: “campo_1”) ;
• um objeto de validação (exemplo: “TRequiredValidator);
• parâmetros específicos do tipo de validação.
Isso é feito dentro do método construtor do componente TPage, e poderia ficar conforme o trecho de código abaixo:
Após adicionar os validadores é necessário invoca-los antes de persistir os dados do formulário. Isso é feito pelo método validate() presente na classe TForm, que invocará o validador presente em cada um dos campos. Isso pode ser notado no trecho de código abaixo:
Se houver algum problema na validação uma exceção será disparada e o catch capturará a mesma exibindo a falha para o usuário.
Como se pôde notar é um processo simples e efetivo, além de ser aplicada na grande maioria dos formulários. No entanto, se você gosta de programar em Java Script, muito provavelmente vai abusar dessa linguagem na construção de sistemas. Então, notará que não será possível fazer uso desse tipo de validação. Para ilustrar, criou-se uma situação hipotética, porém muito frequente, onde há um campo em que poderá ser digitado tanto um CPF quanto um CNPJ, de acordo com o tipo de pessoa escolhido através de um TCombo. O trecho de código Java Script abaixo detalha essa situação.
Note que ao alterar o tipo de pessoa (action change do componente), o label é alterado, o campo é limpo e a máscara alterada. Isso porque uma pessoa física tem CPF e a pessoa jurídica tem CNPJ. Sendo assim, a maneira tradicional de validação não poderá ser aplicada, pois não é possível adivinhar se a pessoa a ser cadastrada é física ou jurídica. A solução é adicionar validadores no método do TPage onde serão persistidos os dados. Como o Framework foi muito bem desenvolvido, seus componentes apresentam um baixo grau de acoplamento, o que permite instanciar validadores e utiliza-los separadamente da classe TForm. O trecho de código permite detalhar a ideia.
Considerando o trecho de código PHP acima, é notado que se for uma pessoa do tipo 1 (pessoa física), então é instanciado um objeto do tipo TRequiredValidator, pois o CPF é considerado um campo obrigatório. Após, é verificado se o campo é diferente de '000.000.000-00', pois muitas vezes o cliente pede que o CPF zerado seja permitido. Se for diferente, então é instanciado um TCPFValidator e feita a validação. Para finalizar é verificado se o CPF é único, utilizando a classe TUniqueValidator desenvolvida por esse autor. O mesmo é feito com o CNPJ, porém ao invés de utilizar a classe TCPFValidator, é utilizada a classe TCNPJValidator.
Esse artigo permitiu discutir a adição de validadores de acordo com o comportamento do formulário, e essa situação pode ser muito frequente quando o objetivo é garantir a usabilidade de um sistema. É claro que existem outras soluções para contornar a situação problema enunciada. Uma delas seria criar um formulário específico para pessoas físicas e outro para pessoas jurídicas. Porém esse autor acredita que o desenvolvimento web é feito com propriedade quando se domina juntamente com linguagens Back-end a linguagem Front-end Java Script. Ou outra, se for utilizada alguma tecnologia baseada em plugin, por exemplo, JavaFX, Silverlight, Flex, Unit, Director, etc. Sendo assim, não tenha medo em usar e abusar do Java Script em suas aplicações com Adianti Framework. Pois, como foi notado é possível facilmente validar campos com estados alterados dinamicamente pelo Java Script.
Coloco-me a disposição para dirimir qualquer dúvida e prestar qualquer esclarecimento. Espero que tenham gostado.
Desde sua primeira versão, o Adianti Framework permite acrescentar validações utilizando o método addValidation() sobre o campo no qual deseja-se validar. Os argumentos do método são específicos ao tipo de validação a ser feito. De maneira geral, os parâmetros passados são:
• o nome para descrever o campo (exemplo: “campo_1”) ;
• um objeto de validação (exemplo: “TRequiredValidator);
• parâmetros específicos do tipo de validação.
Isso é feito dentro do método construtor do componente TPage, e poderia ficar conforme o trecho de código abaixo:
- <?php
- $campo_1 = new TEntry(“campo_1”);
- $campo_1->addValidation(“campo_1”, new TRequiredValidator);
- ?>
Após adicionar os validadores é necessário invoca-los antes de persistir os dados do formulário. Isso é feito pelo método validate() presente na classe TForm, que invocará o validador presente em cada um dos campos. Isso pode ser notado no trecho de código abaixo:
- <?php
- /**
- * Validate form
- */
- public function validate()
- {
- // assign post data before validation
- // validation exception would prevent
- // the user code to execute setData()
- $this->setData($this->getData());
- foreach ($this->fields as $fieldObject)
- {
- $fieldObject->validate();
- }
- }
- ?>
Se houver algum problema na validação uma exceção será disparada e o catch capturará a mesma exibindo a falha para o usuário.
Como se pôde notar é um processo simples e efetivo, além de ser aplicada na grande maioria dos formulários. No entanto, se você gosta de programar em Java Script, muito provavelmente vai abusar dessa linguagem na construção de sistemas. Então, notará que não será possível fazer uso desse tipo de validação. Para ilustrar, criou-se uma situação hipotética, porém muito frequente, onde há um campo em que poderá ser digitado tanto um CPF quanto um CNPJ, de acordo com o tipo de pessoa escolhido através de um TCombo. O trecho de código Java Script abaixo detalha essa situação.
$('select[name=\"tipopessoa_id\"]').change(function(event){
$('select[name=\"tipopessoa_id\"] > option:selected').each(function(){
tipoPessoa = $(this).text();
});
if(tipoPessoa.toLowerCase() == 'física') {
$('label:contains(CNPJ:)').parent().css('left',82);
$('label:contains(CNPJ:)').text('CPF:');
$('input[name=\"cpf_cnpj\"]').val('');
$('input[name=\"cpf_cnpj\"]').attr({onkeypress:'return entryMask(this,event,\"999.999.999-99\")'});
$('input[name=\"insc_estadual\"]').attr({class:'tfield_disabled',readonly:'1',value:''});
}
if(tipoPessoa.toLowerCase() == 'jurídica') {
$('label:contains(CPF:)').parent().css('left',75);
$('label:contains(CPF:)').text('CNPJ:');
$('input[name=\"cpf_cnpj\"]').val('');
$('input[name=\"cpf_cnpj\"]').attr({onkeypress:'return entryMask(this,event,\"99.999.999/9999-99\")'}); $('input[name=\"insc_estadual\"]').attr({class:'tfield',readonly:false,value:''});;
}
});
Note que ao alterar o tipo de pessoa (action change do componente), o label é alterado, o campo é limpo e a máscara alterada. Isso porque uma pessoa física tem CPF e a pessoa jurídica tem CNPJ. Sendo assim, a maneira tradicional de validação não poderá ser aplicada, pois não é possível adivinhar se a pessoa a ser cadastrada é física ou jurídica. A solução é adicionar validadores no método do TPage onde serão persistidos os dados. Como o Framework foi muito bem desenvolvido, seus componentes apresentam um baixo grau de acoplamento, o que permite instanciar validadores e utiliza-los separadamente da classe TForm. O trecho de código permite detalhar a ideia.
- <?php
- // Valida o CPF para pessoas físicas
- if($object->tipopessoa_id == 1)
- {
- $validator = new TRequiredValidator;
- $validator->validate('CPF',$object->cpf_cnpj);
- if($object->cpf_cnpj != '000.000.000-00')
- {
- $validator = new TCPFValidator;
- $validator->validate('CPF',$object->cpf_cnpj);
- $id = $this->form->getField('id');
- $validator = new TUniqueValidator;
- $validator->validate('CPF',$object->cpf_cnpj,array('class'=>'Cliente','field'=>'cpf_cnpj','pk'=>$id));
- }
- }
- // Valida o CNPJ para pessoas jurídicas
- if($object->tipopessoa_id == 2)
- {
- $validator = new TRequiredValidator;
- $validator->validate('CNPJ',$object->cpf_cnpj);
- if($object->cpf_cnpj != '00.000.000/0000-00')
- {
- $validator = new TCNPJValidator;
- $validator->validate('CNPJ',$object->cpf_cnpj);
- $id = $this->form->getField('id');
- $validator = new TUniqueValidator;
- $validator->validate('CNPJ',$object->cpf_cnpj,array('class'=>'Cliente','field'=>'cpf_cnpj','pk'=>$id));
- }
- }
- ?>
Considerando o trecho de código PHP acima, é notado que se for uma pessoa do tipo 1 (pessoa física), então é instanciado um objeto do tipo TRequiredValidator, pois o CPF é considerado um campo obrigatório. Após, é verificado se o campo é diferente de '000.000.000-00', pois muitas vezes o cliente pede que o CPF zerado seja permitido. Se for diferente, então é instanciado um TCPFValidator e feita a validação. Para finalizar é verificado se o CPF é único, utilizando a classe TUniqueValidator desenvolvida por esse autor. O mesmo é feito com o CNPJ, porém ao invés de utilizar a classe TCPFValidator, é utilizada a classe TCNPJValidator.
Esse artigo permitiu discutir a adição de validadores de acordo com o comportamento do formulário, e essa situação pode ser muito frequente quando o objetivo é garantir a usabilidade de um sistema. É claro que existem outras soluções para contornar a situação problema enunciada. Uma delas seria criar um formulário específico para pessoas físicas e outro para pessoas jurídicas. Porém esse autor acredita que o desenvolvimento web é feito com propriedade quando se domina juntamente com linguagens Back-end a linguagem Front-end Java Script. Ou outra, se for utilizada alguma tecnologia baseada em plugin, por exemplo, JavaFX, Silverlight, Flex, Unit, Director, etc. Sendo assim, não tenha medo em usar e abusar do Java Script em suas aplicações com Adianti Framework. Pois, como foi notado é possível facilmente validar campos com estados alterados dinamicamente pelo Java Script.
Coloco-me a disposição para dirimir qualquer dúvida e prestar qualquer esclarecimento. Espero que tenham gostado.
bacana em, parabens pelo artigo
Boa noite sou iniciante adiant framework e querendo aprender, você tem como me dar uma força aqui pois já fiz download e o gostaria de configura-o, preciso saber se funciona com xampp também ou preciso baixar só o apache, dúvidas de iniciante realmente...
Ótimo artigo!
Ei Guilherme,
Você poderia disponibilizar o seu TUniqueValidator?
Gostaria de saber como fez. Preciso de algo semelhante.
Caro guilherme, como ficaria para apenas trocar a mascara dos campos de acordo com pessoa física ou jurídica?
Segue código:
Olá Carlos Stclara.
Pelo que estou vendo, seu código era para estar funcionando. Quando fiz esse artigo usava uma das primeiras versões do Framework. Hoje não sei te dizer se o Adianti Framework ainda utiliza a função "entryMask" para produzir a máscara. Teria que ver isso.
Então, amigo o entryMask foi trocado por tentry_mask.
Resolvido.
[]´s
Stclara.
Como faço pra adicionar uma Classe Validator que criada externamente, no caso esta classe:
neste link: https://www.adianti.com.br/forum/pt/view_1103?tuniquevalidator
Boa noite. Sou novato no framework e me surgiu uma dúvida.
Tenho um formulario de contatos do usuario na qual combo e entry são criados dinamicamente com add button.
Agora quero adicionar mascara ou alguma validaçao de acordo com o item do combo selecionado.
Alguém pode me ajudar?
Ex.:
Seleciono 'TELEFONE' >> Mascara (99) 9999-9999
Seleciono 'EMAIL' >> Valida Email
E assim por diante...
Bom dia Guilherme!
Sei que ja faz mais de 3 anos da sua postagem, hehe, mas estou exatamente com este problema e não entendi muito bem a sua solução.
Fiz o seguinte, por enquanto:
Validadores:
Campos no Formulário:
function change type
Mas na seguinte situação:
Cadastrei uma pessoa física.
o Tipo vai ser F, digito um CPF válido, ele passaria. Mas como o campo CNPJ esta escondido, nao foi preenchido e, desta forma, não é um CNPJ válido.
Podes me explicar a sua solução?
Grato!
Marcos Rodrigo, boa noite!
Não sei se já resolveu sua situação, mas se te ajudar, eu uso da seguinte forma:
1 - Coloco apenas um campo pra CPF ou CNPJ, alterando a mascara via javascript;
2 - Coloco nesse campo um TRequiredValidator para que a label do campo fique vermelha (isso também pode ser feito via css);
3 - No evento onSave, faço a validação abaixo antes de instanciar o Active Record:
Pode ser adaptável à sua utilização.
Espero te ajudado!
Eu verifico se é pessoa física ou jurídica tirando a máscara do CPF/CNPJ (se existir) e contando os caracteres, dai uso o TValida que peguei de um usuário do Fórum, só não lembro onde:
E faço +- isso: