Yii Framework Forum: Validar CPF, CNPJ e colocar mascara ao detectar quantidade - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Validar CPF, CNPJ e colocar mascara ao detectar quantidade Colocar mascara e validar ao usuário digitar um cpf ou cnpj no campo Rate Topic: -----

#1 User is offline   Acácio Lima 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 18-April 12

Posted 12 August 2012 - 01:16 PM

Olá pessoal,

Quero saber se alguem já fez isso, de validar o CPF ou CNPJ digitado e alem disso aplicar uma mascara a depender da quantidade de numeros, ou seja, para cpf são 11 e para cnpj são mais ou menos 14 números.

Agradeço desde já;
0

#2 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 146
  • Joined: 05-August 11
  • Location:Brazil

Posted 13 August 2012 - 02:36 PM

Bom, para acrescentar a máscara ao seu campo é fácil, podes utilizar o CMaskedTextField que já vem no Yii, ou alguma outra extensão. Eu particularmente gosto muito da extensão MeioMask.

Em ambos os links você vai encontrar exemplos de utilização. Se precisares, posso postar algum exemplo meu aqui...

Quanto a questão de validar CPF e/ou CNPJ, tens de adicionar os validadores destes dados ao teu projeto.

Para isso, baixe os validadores:

Após finalizar o download, adicione os validadores a pasta validators dentro da pasta extensions (se a pasta não existir, crie).

Depois é só adicionar ao seu modelo as novas regras...

public function rules()
{
    return array(
	// [...]
	
	array('cpf', 'ext.validators.CPFValidatorName'),
	array('cnpj', 'ext.validators.CNPJValidatorName'),
	
	// [...]
    );
}

0

#3 User is offline   Acácio Lima 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 18-April 12

Posted 14 August 2012 - 01:40 PM

View PostLothor, on 13 August 2012 - 02:36 PM, said:

Bom, para acrescentar a máscara ao seu campo é fácil, podes utilizar o CMaskedTextField que já vem no Yii, ou alguma outra extensão. Eu particularmente gosto muito da extensão MeioMask.

Em ambos os links você vai encontrar exemplos de utilização. Se precisares, posso postar algum exemplo meu aqui...

Quanto a questão de validar CPF e/ou CNPJ, tens de adicionar os validadores destes dados ao teu projeto.

Para isso, baixe os validadores:

Após finalizar o download, adicione os validadores a pasta validators dentro da pasta extensions (se a pasta não existir, crie).

Depois é só adicionar ao seu modelo as novas regras...

public function rules()
{
    return array(
	// [...]
	
	array('cpf', 'ext.validators.CPFValidatorName'),
	array('cnpj', 'ext.validators.CNPJValidatorName'),
	
	// [...]
    );
}



Obrigado amigo. Mas no caso dele identificar automaticamente quando digito no campo, você sabe? Tipo tenho uma input text "CPF/CNPJ", ai quando o usuário digitar ele validar se é um ou outro e já colocar a mascara?
0

#4 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 146
  • Joined: 05-August 11
  • Location:Brazil

Posted 14 August 2012 - 02:01 PM

Humm, acho que entendi, você quer ter um campo que aceite tanto CPF, quanto CNPJ e só validar e colocar a máscara após o usuário digitar, correto?

Se for isso, não cheguei a ver nada ainda que resolva o seu caso, mas tudo é possível, se estivesse com um pouco de tempo livre tentaria ver algo aqui, mas fica a sugestão de utilizar o evento OnChange e alguns dos métodos dos modelos, como o beforeValidate por exemplo, para resolver o problema.
0

#5 User is offline   Bruno Piaui 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 24
  • Joined: 18-October 10

Posted 15 August 2012 - 07:36 AM

View PostAcácio Lima, on 14 August 2012 - 01:40 PM, said:

Obrigado amigo. Mas no caso dele identificar automaticamente quando digito no campo, você sabe? Tipo tenho uma input text "CPF/CNPJ", ai quando o usuário digitar ele validar se é um ou outro e já colocar a mascara?



camarada,
tirando a parte da máscara de campo, a validação no model pode ficar assim:

public function rules()
{
		return array(
				array('cpf_cnpj','validaCPF_CNPJ'),
		);
}


public function validaCPF_CNPJ($attribute, $params)
{
		//código de validação
		
		//if cpf inválido
		$this->addError($attribute, 'CPF inválido!);
		
		//else cnpj inválido
		$this->addError($attribute, 'CNPJ inválido!);
}


vc pode diferenciar se é cpf ou cnpj pelo tamanho do conteúdo do campo e fazer a validação necessária.
0

#6 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 733
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 15 August 2012 - 08:03 AM

Acácio,

Uma solução que sempre faço para não ter uma javascript grande.

Faça dois campos textField, mais deixa eles escondido, adicionando uma class com display:none.

Agora antes desses textField's, você adiciona 2 radio, para selecionar se é Pessoa Física ou Jurídica, ai você mostra o campo conforme a seleção do cliente.

Assim você evita de usar 1 campo para 2 valores, podendo assim limitar o máximo de caracteres para cada campo.

Meu modelo:

Yii::app()->clientScript->registerScript('jquery', "

$('select[id=Cliente_tipopessoa]').live('change', function(){
    var value = $(this).val();

    if(value == 'f'){
        $('div[class=cpf]').show();
        $('div[class=cnpj]').hide();
        $('input[id=Cliente_cnpj]').val('');
    } else if(value == 'j'){
        $('div[class=cnpj]').show();
        $('div[class=cpf]').hide();
        $('input[id=Cliente_cpf]').val('');
    }
});

");

<div>
        <?php echo $form->labelEx($model, 'tipopessoa'); ?>
        <?php
        $tipopessoa = array(
            'f' => 'Pessoa Física',
            'j' => 'Pessoa Jurídica'
        );
        echo $form->dropDownList($model, 'tipopessoa', $tipopessoa, array('prompt' => 'Selecione'));
        ?>
        <?php echo $form->error($model, 'tipopessoa'); ?>
    </div>
<div class="cpf">
        <?php echo $form->labelEx($model, 'cpf'); ?>
        <?php echo $form->textField($model, 'cpf', array('maxlength' => 14)); ?>
        <?php echo $form->error($model, 'cpf'); ?>
    </div>
<div class="cnpj">
        <?php echo $form->labelEx($model, 'cnpj'); ?>
        <?php echo $form->textField($model, 'cnpj', array('maxlength' => 18)); ?>
        <?php echo $form->error($model, 'cnpj'); ?>
    </div>


Newerton Vargas de Araújo
0

#7 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 65
  • Joined: 04-September 12

Posted 26 October 2012 - 03:14 PM

View PostNewerton, on 15 August 2012 - 08:03 AM, said:

Acácio,

Uma solução que sempre faço para não ter uma javascript grande.

Faça dois campos textField, mais deixa eles escondido, adicionando uma class com display:none.

Agora antes desses textField's, você adiciona 2 radio, para selecionar se é Pessoa Física ou Jurídica, ai você mostra o campo conforme a seleção do cliente.

Assim você evita de usar 1 campo para 2 valores, podendo assim limitar o máximo de caracteres para cada campo.

Meu modelo:

Yii::app()->clientScript->registerScript('jquery', "

$('select[id=Cliente_tipopessoa]').live('change', function(){
    var value = $(this).val();

    if(value == 'f'){
        $('div[class=cpf]').show();
        $('div[class=cnpj]').hide();
        $('input[id=Cliente_cnpj]').val('');
    } else if(value == 'j'){
        $('div[class=cnpj]').show();
        $('div[class=cpf]').hide();
        $('input[id=Cliente_cpf]').val('');
    }
});

");

<div>
        <?php echo $form->labelEx($model, 'tipopessoa'); ?>
        <?php
        $tipopessoa = array(
            'f' => 'Pessoa Física',
            'j' => 'Pessoa Jurídica'
        );
        echo $form->dropDownList($model, 'tipopessoa', $tipopessoa, array('prompt' => 'Selecione'));
        ?>
        <?php echo $form->error($model, 'tipopessoa'); ?>
    </div>
<div class="cpf">
        <?php echo $form->labelEx($model, 'cpf'); ?>
        <?php echo $form->textField($model, 'cpf', array('maxlength' => 14)); ?>
        <?php echo $form->error($model, 'cpf'); ?>
    </div>
<div class="cnpj">
        <?php echo $form->labelEx($model, 'cnpj'); ?>
        <?php echo $form->textField($model, 'cnpj', array('maxlength' => 18)); ?>
        <?php echo $form->error($model, 'cnpj'); ?>
    </div>




Newerton,

Apliquei isso e deu certinho. Apenas um detalhe...fazendo desta forma tive que tirar o cpf e o cnpj da rule required, bem como da validação pois os dois nunca serão digitados no mesmo form. Tem alguma maneira de manter estas regras no model ou é do modo como fiz mesmo?
0

#8 User is offline   Newerton 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 733
  • Joined: 27-April 10
  • Location:Campo Grande/MS - Cambé/PR, Brasil

Posted 27 October 2012 - 09:04 PM

Ricardo,

Eu valido isso no beforeValidate() no seu model, coloca uma condição mais ou menos assim:

if($this->tipopessoa == 'f')
    $this->cnpj = 0;
else
    $this->cpf = 0;


Assim os campos recebe algum valor.

Ou senão você pode remover eles do required, e mesmo assim usar condição no beforeValidate()

if($this->tipopessoa == 'f'){
    if(empty($this->cpf)){
        $this->addError('cpf', 'CPF não pode ser vazio.')
    }
} else if($this->tipopessoa == 'j'){
    if(empty($this->cnpj)){
        $this->addError('cnpj', 'CNPJ não pode ser vazio.')
    }
}

Newerton Vargas de Araújo
0

#9 User is offline   ric_ardo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 65
  • Joined: 04-September 12

Posted 29 October 2012 - 07:34 AM

Entendi Newerton, mais uma vez muito obrigado!! Vou tentar aqui e qualquer coisa te falo. Valeu!!!
0

#10 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 146
  • Joined: 05-August 11
  • Location:Brazil

Posted 29 October 2012 - 09:34 AM

Vou precisar fazer isso em breve, valeu pela suggestão Newerton.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users