Cadastro e Login - #31 Esqueci minha senha I
19/12/2018Na vídeo-aula de hoje iremos criar nossa página relativa a Esqueci Minha Senha do sistema de login. Para isso, utilizaremos o PHP e a recém criada ClassMail.
Esqueci Minha Senha com PHP
Primeiramente vamos criar nossa view esqueci-minha-senha.php:
<?php \Classes\ClassLayout::setHead('Esqueci Minha Senha','Recupere sua senha.'); ?>
<div class="topFaixa float w100 center">Esqueci minha senha</div>
<div class="retornoSen float w100 center"></div>
<form name="formSenha" id="formSenha" action="<?php echo DIRPAGE.'controllers/controllerSenha'; ?>" method="post">
<div class="cadastro float center">
<input class="float w100 h40" type="email" id="email" name="email" placeholder="Email:" required>
<input class="float w100 h40" type="text" id="dataNascimento" name="dataNascimento" placeholder="Data de Nascimento:" required>
<input class="float w100 h40" type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" required>
<input class="inlineBlock h40" type="submit" value="Solicitar">
</div>
</form>
<?php \Classes\ClassLayout::setFooter(); ?>
Posteriormente vamos criar nossa view redefinicaoSenha.php:
<?php \Classes\ClassLayout::setHead('Redefinição de Senha','Redefina sua senha!'); ?>
<div class="topFaixa float w100 center">
Cadastro de Clientes
</div>
<div class="retornoSen"></div>
<form name="formRedSenha" id="formRedSenha" action="<?php echo DIRPAGE.'controllers/controllerConfirmacaoSenha'; ?>" method="post">
<div class="cadastro float center">
<input class="float w100 h40" type="email" id="email" name="email" value="<?php echo \Traits\TraitParseUrl::parseUrl(1); ?>" required>
<input class="float w100 h40" type="text" id="token" name="token" value="<?php echo \Traits\TraitParseUrl::parseUrl(2); ?>" required>
<input class="float w100 h40" type="password" id="senha" name="senha" placeholder="Senha:" required>
<input class="float w100 h40" type="password" id="senhaConf" name="senhaConf" placeholder="Confirmação da Senha:" required>
<input class="float w100 h40" type="hidden" id="g-recaptcha-response" name="g-recaptcha-response" required>
<input class="inlineBlock h40" type="submit" value="Cadastrar Nova Senha">
</div>
</form>
<?php \Classes\ClassLayout::setFooter(); ?>
Posteriormente iremos criar nosso controllerSenha.php:
<?php
$validate=new Classes\ClassValidate();
$validate->validateFields($_POST);
$validate->validateEmail($email);
$validate->validateIssetEmail($email,"senha");
$validate->validateData($dataNascimento);
$validate->validateDataNascimento($dataNascimento,$email);
$validate->validateCaptcha($gRecaptchaResponse);
echo $validate->validateFinalSen($arrVar);
Repare no código acima que criamos dois métodos novos: validateDataNascimento($dataNascimento,$email) e o validateFinalSen($arrVar):
#Validação se a data é igual a data do banco de dados
public function validateDataNascimento($dataNascimento,$email)
{
$dataDb=$this->login->getDataUser($email)["data"]["dataNascimento"];
if($dataNascimento == $dataDb){
return true;
}else{
$this->setErro("Data de nascimento não confere com o usuário!");
return false;
}
}
#Validação final do cadastro
public function validateFinalSen($arrVar)
{
if(count($this->getErro())>0){
$arrResponse=[
"retorno"=>"erro",
"erros"=>$this->getErro()
];
}else{
$this->mail->sendMail(
$arrVar['email'],
$arrVar['nome'],
$arrVar['token'],
"Link para Confirmação de Senha",
"
<strong>Redefinação da Senha</strong><br>
Redefina sua senha <a href='".DIRPAGE."redefinicaoSenha/{$arrVar['email']}/{$arrVar['token']}'>clicando aqui</a>.
"
);
$arrResponse=[
"retorno"=>"success",
"erros"=>null
];
$this->cadastro->insConfirmation($arrVar);
}
return json_encode($arrResponse);
}
No model classCadastro fizemos algumas alterações no método insertCad e criamos o método insConfirmation.
#Realizará a inserção no banco de dados
public function insertCad($arrVar)
{
$this->insertDB(
"users",
"?,?,?,?,?,?,?,?,?",
array(
0,
$arrVar['nome'],
$arrVar['email'],
$arrVar['hashSenha'],
$arrVar['dataNascimento'],
$arrVar['cpf'],
$arrVar['dataCreate'],
'user',
'confirmation'
)
);
$this->insConfirmation($arrVar);
}
#Inserção de confirmação
public function insConfirmation($arrVar)
{
$this->insertDB(
"confirmation",
"?,?,?",
array(
0,
$arrVar['email'],
$arrVar['token']
)
);
}
No javascript vamos fazer uma pequena errata no VMasker para evitar conflitos em páginas que não tenhamos um dos campos (cpf ou data de nascimento):
//Máscaras do formulário de cadastro
$('#cpf , #dataNascimento').on('focus', function () {
var id=$(this).attr("id");
if(id == "cpf"){VMasker(document.querySelector("#cpf")).maskPattern("999.999.999-99");}
if(id == "dataNascimento"){VMasker(document.querySelector("#dataNascimento")).maskPattern("99/99/9999")};
});
Por fim vamos fazer nosso ajax:
//Ajax do formulário de confirmação de senha
$("#formSenha").on("submit",function(event){
event.preventDefault();
var dados=$(this).serialize();
$.ajax({
url: getRoot()+'controllers/controllerSenha',
type: 'post',
dataType: 'json',
data: dados,
success: function (response) {
if(response.retorno == 'success'){
$('.retornoSen').html("Redefinição de senha enviada com sucesso!");
}else{
getCaptcha();
$('.retornoSen').empty();
$.each(response.erros,function(key,value){
$('.retornoSen').append(value+'
');
});
}
}
});
});
Ufa! Essa aula foi pesada hein!