Skip to content

Instantly share code, notes, and snippets.

@jonatanfroes
Created August 20, 2012 14:16
Show Gist options
  • Save jonatanfroes/3404635 to your computer and use it in GitHub Desktop.
Save jonatanfroes/3404635 to your computer and use it in GitHub Desktop.
CodeIgniter My_Form_validation p/ validação de CPF e outros
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MY_Form_validation Class
*
* Extends Form_Validation library
*
*/
class MY_Form_validation extends CI_Form_validation {
function __construct()
{
parent::__construct();
}
// --------------------------------------------------------------------
/**
* Unique
*
* Verifica se o valor já está cadastrado no banco
* unique[users.login] retorna FALSE se o valor postado já estiver no campo login da tabela users
* unique[users.login.10] retorna FALSE se o valor postado já estiver no campo login da tabela users, desde que o id seja diferente de 10.
* isso é útil quando for atualizar os dados
* unique[users.city.10:id_cidade] retorna FALSE se o valor postado já estiver no campo city da tabela users, desde que o id_cidade seja diferente de 10.
se não for passado o valor após o : será usado o id.
* @access public
* @param string - dados que será buscado
* @param string - campo, tabela e id
*
* @return bool
*/
function unique($str = '', $field = '')
{
$CI =& get_instance();
$res = explode('.', $field, 3);
$table = $res[0];
$column = $res[1];
$CI->form_validation->set_message('unique', 'O %s informado não está disponível.');
$CI->db->select('COUNT(*) as total');
$CI->db->where($column, $str);
if( isset($res[2]) )
{
$res2 = explode(':', $res[2], 2);
$ignore_value = $res2[0];
if( isset($res2[1]) )
$ignore_field = $res2[1];
else
$ignore_field = 'id';
$CI->db->where($ignore_field . ' !=', $ignore_value);
}
$total = $CI->db->get($table)->row()->total;
return ($total > 0) ? FALSE : TRUE;
}
/**
*
* decimar_br
*
* Verifica se é decimal, mas com virgula no lugar de .
* @access public
* @param string
* @return bool
*/
public function decimal_br($str)
{
$CI =& get_instance();
$CI->form_validation->set_message('decimal_br', 'O campo %s não contem um valor decimal válido.');
return (bool) preg_match('/^[\-+]?[0-9]+\,[0-9]+$/', $str);
}
/**
*
* valid_cpf
*
* Verifica CPF é válido
* @access public
* @param string
* @return bool
*/
function valid_cpf($cpf)
{
$CI =& get_instance();
$CI->form_validation->set_message('valid_cpf', 'O %s informado não é válido.');
$cpf = preg_replace('/[^0-9]/','',$cpf);
if(strlen($cpf) != 11 || preg_match('/^([0-9])\1+$/', $cpf))
{
return false;
}
// 9 primeiros digitos do cpf
$digit = substr($cpf, 0, 9);
// calculo dos 2 digitos verificadores
for($j=10; $j <= 11; $j++)
{
$sum = 0;
for($i=0; $i< $j-1; $i++)
{
$sum += ($j-$i) * ((int) $digit[$i]);
}
$summod11 = $sum % 11;
$digit[$j-1] = $summod11 < 2 ? 0 : 11 - $summod11;
}
return $digit[9] == ((int)$cpf[9]) && $digit[10] == ((int)$cpf[10]);
}
/**
* valid_date
*
* valida data no pradrao brasileiro
*
* @access public
* @param string
* @return bool
*/
function valid_date($data)
{
$CI =& get_instance();
$CI->form_validation->set_message('valid_date', 'O campo %s não contém uma data válida.');
$padrao = explode('/', $data);
return checkdate($padrao[1], $padrao[0], $padrao[2]);
}
/**
* valid_cep
*
* Verifica se CEP é válido
*
* @access public
* @param string
* @return bool
*/
function valid_cep($cep)
{
$CI =& get_instance();
$CI->form_validation->set_message('valid_cep', 'O campo %s não contém um CEP válido.');
$cep = str_replace('.', '', $cep);
$cep = str_replace('-', '', $cep);
$url = 'http://republicavirtual.com.br/web_cep.php?cep='.urlencode($cep).'&formato=query_string';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 0);
$resultado = curl_exec($ch);
curl_close($ch);
if( ! $resultado)
$resultado = "&resultado=0&resultado_txt=erro+ao+buscar+cep";
$resultado = urldecode($resultado);
$resultado = utf8_encode($resultado);
parse_str( $resultado, $retorno);
if($retorno['resultado'] == 1 || $retorno['resultado'] == 2)
return TRUE;
else
return FALSE;
}
/**
* valid_phone
*
* validação simples de telefone
*
* @access public
* @param string
* @return bool
*/
function valid_phone($fone)
{
$CI =& get_instance();
$CI->form_validation->set_message('valid_fone', 'O campo %s não contém um Telefone válido.');
$fone = preg_replace('/[^0-9]/','',$fone);
$fone = (string) $fone;
if( strlen($fone) >= 10)
return TRUE;
else
return FALSE;
}
}
@marcelod
Copy link

Olá Jonatan, muito obrigado por compartilhar esse arquivo. Estou dando uma olhada no seu metodo unique e estou com uma dúvida, pois tenho costume de criar um arquivo form_validation dentro de application/config e só não sei como eu posso passar o valor do id para ele não comparar unique[users.login.10] no caso o 10 por exemplo, mas sem ser explicito assim. Dessa forma que vc colocou imagino que tenho que fazer minha validação direto no controller ou no model (indiferente nesse caso) mas não no meu form_validation como de costume...

segue um exemplo de como eu costumo fazer
https://github.com/marcelod/codeistrap/blob/master/application/config/form_validation.php

Não sei se me entendeu, mas ainda assim obrigado.

@johnt1000
Copy link

Valeu por pela solução Jonatan.

@clayton-mer
Copy link

boa noite estou começando CodeIgniter eu coloquei essa MY_Form_validation.php dentro da pasta libraries e depois coloquei na validação assim.

$this->form_validation->set_rules('cpf', 'CPF', 'required|valid_cpf');

mais não funcionou vc pode me ajudar como posso validar ou se tiver alguem site que posso me ajudar ficaria agradecido desde de já muito obrigado.

@thiago122
Copy link

na data
if(count($padrao) != 3){
return false;
};

@thiago122
Copy link

function __construct($rules = array()){
parent::__construct($rules);

}

@jccatrinck
Copy link

$this->form_validation->error_string() ao invés de validation_errors()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment