Search Results for "Zend_Validate"

Novembro 27th 2008

Validação de CNPJ utilizando Zend_Validate

Simplesmente adaptei a validação de CPF e alterei algumas coisas, é muito parecido.

Segue o código:

PHP:
  1. <?php
  2.  
  3. require_once 'Zend/Validate/Abstract.php';
  4.  
  5. /**
  6.  * Validador para fazer a validação de CNPJ (Cadastro Nacional da Pessoa Jurídica)
  7.  *
  8.  * @author Diego Tremper <diegotremper@gmail.com>
  9.  */
  10. class Validate_Cnpj extends Zend_Validate_Abstract
  11. {
  12.     const INVALID_DIGITS = 'i_number';
  13.    
  14.     const INVALID_FORMAT = 'i_format';
  15.    
  16.     protected $_messageTemplates = array (
  17.                     self::INVALID_DIGITS => "O CNPJ '%value%' não é válido",
  18.                     self::INVALID_FORMAT => "O formato do CNPJ '%value%' não é válido"
  19.               );
  20.               
  21.     private $_pattern = '/(\d{2})\.(\d{3})\.(\d{3})\/(\d{4})-(\d{2})/i';
  22.    
  23.     private $_skipFormat = false;
  24.    
  25.     /**
  26.      * Inicializa a instância do validador
  27.      *
  28.      * @param bool $skipFormat ignorar validação no formato?
  29.      */
  30.     public function __construct($skipFormat = false) {
  31.         $this->_skipFormat = $skipFormat;
  32.     }
  33.    
  34.     /**
  35.      * verifica se o cnpj é válido
  36.      *
  37.      * @param string $value cnpj a ser validado
  38.      * @return bool
  39.      */
  40.     public function isValid($value)
  41.     {
  42.         $this->_setValue ( $value );
  43.        
  44.         if (!$this->_skipFormat && preg_match($this->_pattern, $value) == false) {
  45.             $this->_error(self::INVALID_FORMAT);
  46.             return false;
  47.         }
  48.        
  49.         $digits = preg_replace('/[^\d]+/i', '', $value);
  50.         $firstSum = 0;
  51.         $secondSum = 0;
  52.        
  53.         $firstSum += (5*$digits{0}) + (4*$digits{1}) + (3*$digits{2}) + (2*$digits{3});
  54.         $firstSum += (9*$digits{4}) + (8*$digits{5}) + (7*$digits{6}) + (6*$digits{7});
  55.         $firstSum += (5*$digits{8}) + (4*$digits{9}) + (3*$digits{10}) + (2*$digits{11});
  56.        
  57.         $firstDigit = 11 - fmod($firstSum, 11);
  58.        
  59.         if ($firstDigit>= 10) {
  60.             $firstDigit = 0;
  61.         }
  62.        
  63.         $secondSum += (6*$digits{0}) + (5*$digits{1}) + (4*$digits{2}) + (3*$digits{3});
  64.         $secondSum += (2*$digits{4}) + (9*$digits{5}) + (8*$digits{6}) + (7*$digits{7});
  65.         $secondSum += (6*$digits{8}) + (5*$digits{9}) + (4*$digits{10}) + (3*$digits{11});
  66.         $secondSum += ($firstDigit*2);
  67.        
  68.         $secondDigit = 11 - fmod($secondSum, 11);
  69.        
  70.         if ($secondDigit>= 10) {
  71.             $secondDigit = 0;
  72.         }
  73.        
  74.         if (substr($digits, -2) != ($firstDigit . $secondDigit)) {
  75.             $this->_error(self::INVALID_DIGITS);
  76.             return false;
  77.         }
  78.        
  79.         return true;
  80.     }
  81. }

Para testar:

PHP:
  1. <?php
  2.  
  3. require_once 'Validate/Cnpj.php';
  4.  
  5. /**
  6.  * testar cnpj com validação no formato e digito verificador
  7.  */
  8. $v = new Validate_Cnpj ( );
  9. var_dump ( $v->isValid ( "03.847.655/0001-98" ) ); //cnpj válido
  10. print_r ( $v->getMessages () );
  11.  
  12. var_dump ( $v->isValid ( "03.847.655/000198" ) ); //cnpj com formato inválido
  13. print_r ( $v->getMessages () );
  14.  
  15. var_dump ( $v->isValid ( "03.847.655/0001-90" ) ); //cnpj com digito verificador inválido
  16. print_r ( $v->getMessages () );
  17.  
  18. /**
  19.  * testar cnpj com validação de digito verificador e SEM validação de formato
  20.  */
  21. $v = new Validate_Cnpj ( true );
  22. var_dump ( $v->isValid ( "03.847.655/0001-98" ) ); //cnpj válido
  23. var_dump ( $v->isValid ( "03847655000198" ) ); //cnpj válido
  24. print_r ( $v->getMessages () );
  25.  
  26. $v = new Validate_Cnpj ( true );
  27. var_dump ( $v->isValid ( "03847655000190" ) ); //cnpj com digito verificador inválido
  28. print_r ( $v->getMessages () );

Os arquivos estão disponíveis no link a seguir: zend_validate_cnpj

[]s

1 Comment »

Novembro 25th 2008

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:
  1. <?php
  2.  
  3. require_once 'Zend/Validate/Abstract.php';
  4.  
  5. /**
  6.  * Validador para fazer a validação de CPF (Cadastro de Pessoas Físicas)
  7.  *
  8.  * @author Diego Tremper <diegotremper@gmail.com>
  9.  */
  10. class Validate_Cpf extends Zend_Validate_Abstract
  11. {
  12.     const INVALID_DIGITS = 'i_number';
  13.    
  14.     const INVALID_FORMAT = 'i_format';
  15.    
  16.     protected $_messageTemplates = array (
  17.                     self::INVALID_DIGITS => "O cpf '%value%' não é válido",
  18.                     self::INVALID_FORMAT => "O formato do cpf '%value%' não é válido"
  19.               );
  20.               
  21.     private $_pattern = '/(\d{3})\.(\d{3})\.(\d{3})-(\d{2})/i';
  22.    
  23.     private $_skipFormat = false;
  24.    
  25.     /**
  26.      * Inicializa a instância do validador
  27.      *
  28.      * @param bool $skipFormat fazer validação no formato?
  29.      */
  30.     public function __construct($skipFormat = false) {
  31.         $this->_skipFormat = $skipFormat;
  32.     }
  33.    
  34.     /**
  35.      * verifica se o cpf é válido
  36.      *
  37.      * @param string $value cpf a ser validado
  38.      * @return bool
  39.      */
  40.     public function isValid($value)
  41.     {
  42.         $this->_setValue ( $value );
  43.        
  44.         if (!$this->_skipFormat && preg_match($this->_pattern, $value) == false) {
  45.             $this->_error(self::INVALID_FORMAT);
  46.             return false;
  47.         }
  48.        
  49.         $digits = preg_replace('/[^\d]+/i', '', $value);
  50.         $firstSum = 0;
  51.         $secondSum = 0;
  52.        
  53.         for ($i=0; $i<9; $i++) {
  54.             $firstSum += $digits{$i} * (10 - $i);
  55.             $secondSum += $digits{$i} * (11 - $i);
  56.         }
  57.        
  58.         $firstDigit = 11 - fmod($firstSum, 11);
  59.        
  60.         if ($firstDigit>= 10) {
  61.             $firstDigit = 0;
  62.         }
  63.        
  64.         $secondSum = $secondSum + ($firstDigit*2);
  65.         $secondDigit = 11 - fmod($secondSum, 11);
  66.        
  67.         if ($secondDigit>= 10) {
  68.             $secondDigit = 0;
  69.         }
  70.        
  71.         if (substr($digits, -2) != ($firstDigit . $secondDigit)) {
  72.             $this->_error(self::INVALID_DIGITS);
  73.             return false;
  74.         }
  75.        
  76.         return true;
  77.     }
  78. }

Para utilizar:

PHP:
  1. <?php
  2.  
  3. require_once 'Validate/Cpf.php';
  4.  
  5. /**
  6.  * testar cpf com validação no formato e digito verificador
  7.  */
  8. $v = new Validate_Cpf ( );
  9. var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
  10. print_r ( $v->getMessages () );
  11.  
  12. var_dump ( $v->isValid ( "123.456.78909" ) ); //cpf com formato inválido
  13. print_r ( $v->getMessages () );
  14.  
  15. var_dump ( $v->isValid ( "123.456.789-08" ) ); //cpf com digito verificador inválido
  16. print_r ( $v->getMessages () );
  17.  
  18. /**
  19.  * testar cpf com validação de digito verificador e SEM validação de formato
  20.  */
  21. $v = new Validate_Cpf ( true );
  22. var_dump ( $v->isValid ( "123.456.789-09" ) ); //cpf válido
  23. var_dump ( $v->isValid ( "12345678909" ) ); //cpf válido
  24. print_r ( $v->getMessages () );
  25.  
  26. $v = new Validate_Cpf ( true );
  27. var_dump ( $v->isValid ( "12345678900" ) ); //cpf com digito verificador inválido
  28. 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 »