Pages

Subscribe:

Ads 468x60px

Labels

28/02/2014

Criando um formulário validador de CPF com Ajax Jquery.

Algoritmo do CPF - O que está por trás do gerador de CPF 

Para exemplificar o processo vamos gerar um CPF válido, calculando os dígitos verificadores de um número hipotético, 111.444.777-XX.

Calculando o Primeiro Dígito Verificador:

   O primeiro dígito verificador do CPF é calculado utilizando-se o seguinte algoritmo. 1) Distribua os 9 primeiros dígitos em um quadro colocando os pesos 10, 9, 8, 7, 6, 5, 4, 3, 2 abaixo da esquerda para a direita, conforme representação abaixo:

111444777
1098765432

 2) Multiplique os valores de cada coluna:

111444777
1098765432
1098282420282114

3) Calcule o somatório dos resultados (10+9+...+21+14) = 162

4) O resultado obtido (162) será divido por 11. Considere como quociente apenas o valor inteiro, o resto da divisão será responsável pelo cálculo do primeiro dígito verificador.
Vamos acompanhar: 162 dividido por 11 obtemos 14 como quociente e 8 como resto da divisão. Caso o resto da divisão seja menor que 2, o nosso primeiro dígito verificador se torna 0 (zero), caso contrário subtrai-se o valor obtido de 11, que é nosso caso. Sendo assim nosso dígito verificador é 11-8, ou seja, 3 (três). Já temos portanto parte do CPF, confira: 111.444.777-3X.


Veja agora como implementar isso em PHP + jQuery:

Arquivo => index.html:
-------------------------------------------------------------------------------------------------------------------
<html>
<head>
  <script src="js/jquery-1.2.6.pack.js" type="text/javascript"></script>
  <script src="js/jquery.maskedinput-1.1.4.pack.js" type="text/javascript"></script>
  <script type="text/javascript">
   $(document).ready(function(){
    $("#cpf").mask("999.999.999-99");
   });
   
   //minha funcao validadora
   function  enviaValor(){
    var valor = $('#cpf').val();
    //console.log($('#cpf').val());
    $(document).ready(function(){
      //efetuando a gravação e contabilização de pratos mais acessados
      $.post(
       "./validar.php",
       { codigo: valor  },
       function(data) {
        //console.log(data);
        if(data == 1) {  
         $("#saida").html("<span style='color: green'>CPF Válido!</span>");   
        } else {  
         $("#saida").html("<span style='color: red'>CPF Inválido!</span>");   
        }
       }
        );
    });
   }
  </script>
</head>
 <title>
 Validar CPF
 </title>
</html></pre>
<body>
  <form action="" id="form1" method="post" name="form1">
   <div align="center">
    <table border="0" cellpadding="0" cellspacing="0" style="width: 100%px;">
     <tbody>
<tr>
       <td height="40">
        <div align="center">
         <input class="saida" id="cpf" name="cpf" type="text" />
        </div>
</td>
      </tr>
<tr>
       <td>
        <div align="center">
         <input id="botaoValidarCPF" name="botaoValidarCPF" onclick="enviaValor();" style="cursor: pointer; font-size: 15px;" type="button" value="Validar CPF" />
        </div>
<div align="center" class="style7" id="saida">
         <span style="color: green;"></span>
        </div>
</td>
      </tr>
</tbody>
    </table>
</div>
</form>
</body>
------------------------------------------------------------------------------ 
 Observe que linha onde é importado o arquivo .js, é uma biblioteca (jquery.maskedinput) de mascaras javascript e é aplicada na linha 7;

Em seguida é criado uma função javascript de nome "enviaValor()" que possui uma requisição Ajax jQuery $.post que envia o valor do campo de formulario para o arquivo PHP "validar.php" receber e procesar da seguinte forma:

---------------------------------------------------------------------------------------------------------------------

 <?php
 //recebe o dado vindo da pagina via Ajax jQuery
$cpf = (isset($_REQUEST['codigo'])) ? $_REQUEST['codigo'] : "" ;


//funcao que retira o ponto e traço e valida o CPF com o calculo do algoritmo
function validaCPF($cpf = null) {

    // Verifica se um número foi informado
    if(empty($cpf)) {
        return false;
    }

    // Elimina possivel mascara
    $cpf = ereg_replace('[^0-9]', '', $cpf);
    $cpf = str_pad($cpf, 11, '0', STR_PAD_LEFT);
   
    // Verifica se o numero de digitos informados é igual a 11
    if (strlen($cpf) != 11) {
        return false;
    }
    // Verifica se nenhuma das sequências invalidas abaixo
    // foi digitada. Caso afirmativo, retorna falso
    else if ($cpf == '00000000000' ||
        $cpf == '11111111111' ||
        $cpf == '22222222222' ||
        $cpf == '33333333333' ||
        $cpf == '44444444444' ||
        $cpf == '55555555555' ||
        $cpf == '66666666666' ||
        $cpf == '77777777777' ||
        $cpf == '88888888888' ||
        $cpf == '99999999999') {
        return false;
     // Calcula os digitos verificadores para verificar se o
     // CPF é válido
     } else { 
       
        for ($t = 9; $t < 11; $t++) {
           
            for ($d = 0, $c = 0; $c < $t; $c++) {
                $d += $cpf{$c} * (($t + 1) - $c);
            }
            $d = ((10 * $d) % 11) % 10;
            if ($cpf{$c} != $d) {
                return false;
            }
        }

        return true;
    }
}

//verifica se não enviado o formulario em branco
if($cpf !== ""){
        //verifica se a funçao retornou "true" ou "false"
        if(validaCPF($cpf)){
            echo 1;
        } else {
            echo 0;
        }
} else {
    echo "Digite um CPF!";
}

?>
---------------------------------------------------------------------------------------------------------------------

Um exemplo funcionando pode ser visto abaixo:

Um abraço e até a próxima a todos(as)!

20/02/2014

Como criar uma loja on-line: 10 perguntas que você deve fazer antes de contratar um desenvolvedor de comércio eletrônico

19/02/2014

Site para uso de várias fotos e imagens tematicas variadas

Neste post do site abaixo segue uma relação de sites que disponibilizaram muitas fotos para se usar em diferentes projetos:

Um abraço e até logo!

11/02/2014

Personalizar Mensagens “setFlash” no CakePHP

Olá,  estive com uma dificuldade de entender como modificava as mensagens de erro e sucesso padrão do CakePHP e achei um interessante tutorial:







Como achei muito útil para mim gostaria de compartilhar este tutorial:

1º Passo:
 
Criar arquivo: /app/views/elements/flash-sucesso.ctp
<div class="flash-sucesso">
“O cadastro foi concluído com sucesso!”
</div>


2º Passo:
 
Criar arquivo: /app/views/elements/flash-erro.ctp
<div class="flash-erro">
“Não foi possível salvar. Tente novamente.”
</div>


ALTERANDO O CONTROLLER

Devemos agora alterar o controller para chamar os arquivos que criamos na pasta “views/elements/”.
//CONTROLLER
$this->Session->setFlash(‘’, ‘flash-sucesso’);
//ou
$this->Session->setFlash(‘’, ‘flash-erro’);


CRIANDO O CSS
 
Criar arquivo: /app/webroot/css/css-styles.css
.flash-sucesso {
background: #e5f2be;
border:2px solid #bedf5d;
padding:10px;
font-weight:bold;
}
.flash-erro {
background: #eccecf;
border:2px solid #9e0b0f;
padding:10px;
font-weight:bold;
}


Não, eu não criei o código css acima, apenas dei um CTRL C + CTRL V para facilitar a minha vida e a de vocês. Sejamos práticos galera! Rsrs.
Pronto! Basicamente é isto. Simples, não é?
É claro que vocês podem ainda criar “n” situações com o setFlash. Vocês podem implementar funcionalidades com o jQuery, tais como: criar um botão “fechar” dentro da mensagem, fazer com que a mensagem suma depois de alguns segundos, etc. Isso vai depender do conhecimento, da criatividade e da preguiça de cada um. =D
Espero que tenham gostado.
Abraços e até a próxima!


http://mytechnews.com.br/blog/?p=64

10/02/2014

TRABALHANDO COM O CAKEPHP E O USO DE JOIN


Entre os framaworks de desenvolvimento ágil e rápido de aplicações em linguagem PHP, temos o CakePHP.  Criado e mantido pelo desenvolvedor  Garrett Woodworth (aproximadamente em 2009).  Possui uma excelente estrutura contendo todos os padrões de separação de camadas do MVC e boas práticas de programação.  Sua documentação e colaboração em sua comunidade tem animado mais e mais a multiplicar seus novos adeptos a este framework.

Vou tratar de deixar registrado um recurso para quem já iniciou seus projetos com o CakePHP ou pretende iniciar, que trata sobre o uso de JOINS numa consulta que retorna uma paginação de resultados vindo de 2 ou mais tabelas de um banco relacional MySQL.
Observe que neste exemplo temos na linha 43 a parametrização do recursive como -1, para que o JOIN desta consulta ocorra desprezando os relacionamentos existentes no Model da aplicação para este contexto de visão no Controller.  

A linha 44 além de trazer o relacionamento dos campos da tabela de Log e Users(usuários) ele armazena em uma sub-consulta a data de último acesso ao sistema através da leitura do registro de ultimo acesso:
$this->paginate['User']['fields'] = array('Log.*,(SELECT MAX(created) FROM logs WHERE users = User.id ORDER BY created DESC LIMIT 1) as ultimo','User.*');

Nas linhas 46 a 53 temos a consulta JOIN de relacionamento da tabela users com a tabela logs através de suas respectivas chaves primária e estrangeiras.

Na linha 54 temos uma conditions (condição) para caso o filtro de busca seja usado será filtrado e adequadamente listado.

Linha 55 temos o agrupamento da tabela ou GROUP BY, seguido pelo ORDER (ordenação linha 56) e limite de páginas a serem exibidas na listagem (linha 57).

A estrutura da classe do modelo de Log ficou simples e objetiva para este caso:
-------------------------------------------------------------------------------------------------------
class Log extends AppModel {
    
    public $name = 'Log';

public $belongsTo = array(
        'User' => array(
            'className'=> 'User', 
            'foreignKey' => 'users'
)
      );
}
-------------------------------------------------------------------------------------------------------

Já a classe de modelo (Model) de usuário foi mantido acrescentado ao atributo $belongsTo o relacionamento do Model Logs:
-------------------------------------------------------------------------------------------------------
public $belongsTo = array(
'Group' => array(
'className' => 'Group',
'foreignKey' => 'group_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Log' => array(
'className' => 'Log',
'foreignKey' => 'id'
)
);
------------------------------------------------------------------------------------------------------- 

Disso resultará uma consulta para listar todos os usuários ativos e suas respectivas data e hora de último acesso:


Podemos ver na coluna Ultimo - Acesso a data e hora de último acesso de cada usuário ao sistema.

Achei bom compartilhar esta experiência e agradeço a colaboração e ajuda de meu amigo Victor Souto que me orientou a melhor prática para chegar a esse resultado.

Um abraço a todos (as).
Bibliografia:
http://pt.wikipedia.org/wiki/CakePHP
http://www.mainelydesign.com/blog/view/forcing-a-single-join-in-cakephp-pagination
http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html