Created
August 20, 2012 14:16
-
-
Save jonatanfroes/3404635 to your computer and use it in GitHub Desktop.
CodeIgniter My_Form_validation p/ validação de CPF e outros
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
Valeu por pela solução Jonatan.
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.
na data
if(count($padrao) != 3){
return false;
};
function __construct($rules = array()){
parent::__construct($rules);
}
$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
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.