Dopo aver controllato che il valore passato tramite GET esista, mostriamo il modulo per il reset della password. Facciamo di nuovo inserire per maggiore sicurezza l'email, e diamo all'utente la possibilità di scegliere la sua nuova password.
Aggiorniamo l'uid e spediamo tramite email i nuovi valori fornendo un link per il login.
L'unica cosa degna di nota è presente nella classe UserResetModel in cui si effettua una query per recuperare nickname e username ed assegnarli alla proprietà data della classe UserResetData.
UserResetModel
Codice php:
class UserResetModel extends UserModel{
private $validator= null;
private $mail= null;
public function __construct($db){
parent::__construct($db);
$this->setData();
}
protected function setData(){
$this->data= new UserResetData(
getPostValue('u_email'),
getPostValue('u_password'),
getGetValue('u')
);
$this->validator= new UserResetValidator($this->data);
}
public function getView(){
if($this->validator->isValid()){
$nuid= getUid();
if($this->reset($nuid)){
refresh('login.php');
deleteSession('email');
$this->username($nuid);
$this->mail= new UserResetMail($this->data);
$this->mail->send();
return new UserConfirmView(SENT_EMAIL_RESET);
}
else{
refresh('login.php');
deleteSession('email');
return new UserErrorView(array(NOT_RESET_YET));
}
}
else{
refresh('reset.php?u='.$this->data->uid);
setSession('email',$this->data->email);
return new UserErrorView($this->validator->getErrors());
}
}
private function reset($nuid){
$sql= "UPDATE users SET user_password=";
$sql.= "MD5(".$this->db->quote($this->data->password)."),";
$sql.= "user_uid=".$this->db->quote($nuid);
$sql.= " WHERE user_email=".$this->db->quote($this->data->email);
$sql.= " && user_uid=".$this->db->quote($this->data->uid);
$sql.= " && user_confirm='1' LIMIT 1";
return (bool)$this->db->exec($sql);
}
public function username($nuid){
// Con questo metodo recuperiamo nickname e username
// da spedire via email
$sql= "SELECT user_nick AS nick,user_name AS username FROM users
WHERE user_uid=:uid LIMIT 1";
$sth= $this->db->prepare($sql);
$excute= array(':uid'=>$nuid);
$sth->execute($excute);
$result= $sth->fetch(PDO::FETCH_OBJ);
$this->data->nickname= $result->nick;
$this->data->username= $result->username;
}
}
Ultima cosa che voglio farvi notare è l'utilizzo, nel blocco try e catch, della funzione error_log, che spedisce una email con l'errore che si è verificato all'admin e l'uso di un redirect che mostra all'utente, una pagina di errore appositamente costruita.
Blocco try e catch
Codice php:
try{
$userResetController= new UserResetController($db);
echo $userResetController->getPage();
$db= null;
}
catch(InvalidArgException $e){
error_log($e->getMessage(), 1,WARN_MAIL);
redirect('error.php');
}
catch(PDOException $e){
error_log($e->getMessage(), 1,WARN_MAIL);
redirect('error.php');
}
catch(MailException $e){
error_log($e->getMessage(), 1,WARN_MAIL);
redirect('error.php');
}
Conclusioni
Questa lunga serie di tutorials per implementare un semplice User Manager con il Model View Controller è terminata spero vi sia piaciuta.
Aspetto fiducioso un vs. feed back. Alla prossima ;).
Puoi scaricare l'intero script qui.