Validar CPF, CNPJ e colocar mascara ao detectar quantidade Colocar mascara e validar ao usuário digitar um cpf ou cnpj no campo
#1
Posted 12 August 2012 - 01:16 PM
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á;
#2
Posted 13 August 2012 - 02:36 PM
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'),
// [...]
);
}
#3
Posted 14 August 2012 - 01:40 PM
Lothor, on 13 August 2012 - 02:36 PM, said:
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?
#4
Posted 14 August 2012 - 02:01 PM
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.
#5
Posted 15 August 2012 - 07:36 AM
Acácio Lima, on 14 August 2012 - 01:40 PM, said:
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.
#6
Posted 15 August 2012 - 08:03 AM
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>
#7
Posted 26 October 2012 - 03:14 PM
Newerton, on 15 August 2012 - 08:03 AM, said:
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?
#8
Posted 27 October 2012 - 09:04 PM
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.')
}
}
#9
Posted 29 October 2012 - 07:34 AM
#10
Posted 29 October 2012 - 09:34 AM

Help















