Novembro 25th 2008 03:48 am
Validação de CPF utilizando Zend_Validate
Há algum tempo eu estava devendo algum post técnico, então resolvi dar uma brincada com o Zend_Validate, posto aqui um validator que fiz para CPF (Cadastro de Pessoas Físicas). A quem possa servir segue o código:
PHP:
-
<?php
-
-
require_once 'Zend/Validate/Abstract.php';
-
-
/**
-
* Validador para fazer a validação de CPF (Cadastro de Pessoas Físicas)
-
*
-
* @author Diego Tremper <diegotremper@gmail.com>
-
*/
-
class Validate_Cpf extends Zend_Validate_Abstract
-
{
-
const INVALID_DIGITS = 'i_number';
-
-
const INVALID_FORMAT = 'i_format';
-
-
protected $_messageTemplates = array (
-
self::INVALID_DIGITS => "O cpf '%value%' não é válido",
-
self::INVALID_FORMAT => "O formato do cpf '%value%' não é válido"
-
);
-
-
private $_pattern = '/(\d{3})\.(\d{3})\.(\d{3})-(\d{2})/i';
-
-
private $_skipFormat = false;
-
-
/**
-
* Inicializa a instância do validador
-
*
-
* @param bool $skipFormat fazer validação no formato?
-
*/
-
public function __construct($skipFormat = false) {
-
$this->_skipFormat = $skipFormat;
-
}
-
-
/**
-
* verifica se o cpf é válido
-
*
-
* @param string $value cpf a ser validado
-
* @return bool
-
*/
-
public function isValid($value)
-
{
-
$this->_setValue ( $value );
-
-
if (!$this->_skipFormat && preg_match($this->_pattern, $value) == false) {
-
$this->_error(self::INVALID_FORMAT);
-
return false;
-
}
-
-
$digits = preg_replace('/[^\d]+/i', '', $value);
-
$firstSum = 0;
-
$secondSum = 0;
-
-
for ($i=0; $i<9; $i++) {
-
$firstSum += $digits{$i} * (10 - $i);
-
$secondSum += $digits{$i} * (11 - $i);
-
}
-
-
$firstDigit = 11 - fmod($firstSum, 11);
-
-
if ($firstDigit>= 10) {
-
$firstDigit = 0;
-
}
-
-
$secondSum = $secondSum + ($firstDigit*2);
-
$secondDigit = 11 - fmod($secondSum, 11);
-
-
if ($secondDigit>= 10) {
-
$secondDigit = 0;
-
}
-
-
if (substr($digits, -2) != ($firstDigit . $secondDigit)) {
-
$this->_error(self::INVALID_DIGITS);
-
return false;
-
}
-
-
return true;
-
}
-
}
Para utilizar:
PHP:
-
<?php
-
-
require_once 'Validate/Cpf.php';
-
-
/**
-
* testar cpf com validação no formato e digito verificador
-
*/
-
$v = new Validate_Cpf ( );
-
var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
-
print_r ( $v->getMessages () );
-
-
var_dump ( $v->isValid ( "123.456.78909" ) ); //cpf com formato inválido
-
print_r ( $v->getMessages () );
-
-
var_dump ( $v->isValid ( "123.456.789-08" ) ); //cpf com digito verificador inválido
-
print_r ( $v->getMessages () );
-
-
/**
-
* testar cpf com validação de digito verificador e SEM validação de formato
-
*/
-
$v = new Validate_Cpf ( true );
-
var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
-
var_dump ( $v->isValid ( "12345678909" ) ); //cpf válido
-
print_r ( $v->getMessages () );
-
-
$v = new Validate_Cpf ( true );
-
var_dump ( $v->isValid ( "12345678900" ) ); //cpf com digito verificador inválido
-
print_r ( $v->getMessages () );
Para quem quiser os arquivos segue o link: validate.zip. (Não há nada além do código acima!)
Referência: http://framework.zend.com/manual/en/zend.validate.html
[]s
5 Comments »














Nivaldo Arruda on 25 Nov 2008 at 10:52 #
Eu ia providenciar um desses essa semana mesmo. Mas como assino seu rss, vai me poupar algum trabalho. Vou baixar e testar depois.
^^
Abraços
Pablo Luz on 07 Ago 2009 at 13:00 #
Valeu, Diego! Código simples e funcional. Virei fã do teu blog.
muan on 04 Set 2009 at 23:25 #
Boa! belo trabalho! =)
Fernanda Leme on 22 Out 2009 at 19:34 #
Muito bom o post…
Achei mais coisa legal nesse site:
http://www.gerardocumentos.com.br/?pg=funcao-javascript-para-gerar-cpf
http://www.gerardocumentos.com.br/?pg=entenda-a-formula-do-cpf
Tem de outros documentos tbm:
http://www.gerardocumentos.com.br/?pg=gerador-cnpj-valido
http://www.gerardocumentos.com.br/?pg=gerador-rg-valido
Waldeyr Mendes on 10 Nov 2009 at 20:24 #
Olá! Amigo, como ficaria o uso da classe se quiser utilizá-la como validator dentro de uma classe Zend_form?
Exemplo:
class SIGA_Form_AtualizarAluno extends Zend_Form {
public function init(){
$translate = Zend_Registry::get(’translate’);
$this->setTranslator($translate);
$this->setAction($this->baseUrl . ‘atualizar’);
$this->setMethod(’post’);
$aluCPF = $this->createElement(’text’, ‘aluCPF’, array(’label’=>’CPF:’, ’size’=>’14′));
$aluCPF->setRequired(true)
->addValidator( ? );
$this->addElement($aluCPF);
}
}