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: 147
  • 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: 147
  • 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: 25
  • 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: 821
  • 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: 70
  • 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: 821
  • 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: 70
  • 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: 147
  • 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

#11 User is offline   Diego B Reis 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 09-December 13

Posted 19 December 2013 - 11:27 AM

Galera, tudo bem? Tenho uma dúvida quanto a validação de CPF e CNPJ. Tenho um form que cadastra cliente fisico ou juridico, ele mostra um ou outro com uma funcao javascript. Quando vou cadastrar ele pede validação dos 2 campos. Tirei a validação e na hora de salvar ele tá salvando os 2 campos, e o que não foi preenchido fica todo zerado.

Por exemplo CPF 000000000-00 CNPJ 02.584.520/0854-90. Alguem pode me ajudar?

Meu _form.php

<script>
function muFun(obj){
if(obj=="CPF"){
document.getElementById('CPF').style.display="block";
document.getElementById('CNPJ').style.display="none";
return false;
}else{
document.getElementById('CNPJ').style.display="block";
document.getElementById('CPF').style.display="none";
return false;
}
}
</script>


<p class="note">Campos com <span class="required">*</span> são obrigatórios.</p>

<?php echo $form->errorSummary($model); ?>

<div class="row">
<?php echo $form->labelEx($model, 'Tipo de Cliente: &nbsp;*&nbsp;'); ?>
<?php echo $form->dropDownList($model, 'tipocliente', array(''=>'Selecione','CPF'=>'Cliente Físico','CNPJ'=>'Cliente Jurídico'),array('onchange'=>'return muFun(this.value)')); ?>
<?php echo $form->error($model, 'tipocliente'); ?>
</div>

<div id="CPF" style="display:none">
<div class="row" id="CPF">
<?php echo $form->labelEx($model,'C P F: &nbsp;*&nbsp;'); ?>
<?php
$this->widget('CMaskedTextField', array(
'model' => $model,
'attribute' => 'cpf',
'mask' => '999.999.999-99',
'htmlOptions' => array('size' => 14)
))
?>
<?php echo $form->error($model,'cpf'); ?>
</div>
</div>

<div id="CNPJ" style="display:none">
<div class="row" id="CNPJ">
<?php echo $form->labelEx($model,'C N P J &nbsp;*&nbsp;'); ?>
<?php
$this->widget('CMaskedTextField', array(
'model' => $model,
'attribute' => 'cnpj',
'mask' => '99.999.999/9999-99',
'htmlOptions' => array('size' => 14)
))
?>
<?php echo $form->error($model,'cnpj'); ?>
</div>
</div>

<div class="row">
<?php echo $form->labelEx($model,'Nome / Razão Social: *&nbsp;'); ?>
<?php echo $form->textField($model,'nome',array('size'=>60,'maxlength'=>200)); ?>
<?php echo $form->error($model,'nome'); ?>
</div>
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