UserRegisterData
Codice php:
class UserRegisterData extends UserDataSetter {
public function __construct($nickname,$username,$password,$email, $uid) {
$this->nickname= $nickname;
$this->username= $username;
$this->password= $password;
$this->email= $email;
$this->uid= $uid;
}
}
La classe UserRegisterData setta concretamente i dati necessari per la registrazione estentendo UserDataSetter.
UserRegisterValidator
Codice php:
class UserRegisterValidator extends UserValidator{
public function __construct(UserRegisterData $data){
parent::__construct($data);
$this->validation();
}
public function validation(){
$this->add(new IsValidString('nickname',$this->data->nickname));
$this->add(new IsValidString('username',$this->data->username));
$this->add(new IsValidString('password',$this->data->password));
$this->add(new isTheSame(FIELDS_PASSWORD,array(
$this->data->password,
getPostValue('u_rpassword')
)
)
);
$this->add(new IsValidEmail('email',$this->data->email));
$security= getSession('security');
if(empty($security)){
$security= getUid();
}
$this->add(new isTheSame(FIELDS_SECURITY,array(
$security,
getPostValue('u_security'))
)
);
}
public function extraValidation($nickExist,$emailExist){
$this->add(new justTaken('nickname',$nickExist));
$this->add(new justTaken('email',$emailExist));
}
}
La classe UserRegisterValidator verifica la validità dei dati immessi e l'unicità del nickname e della mail (entrambi di type UNIQUE nella tabella users).
UserRegisterModel
Codice php:
class UserRegisterModel extends UserModel{
private $validator= null;
private $mail= null;
public function __construct($db){
parent::__construct($db);
$this->setData();
}
/* Istanzio le classi necessarie */
protected function setData(){
$this->data= new UserRegisterData(
getPostValue('u_nickname'),
getPostValue('u_username'),
getPostValue('u_password'),
getPostValue('u_email'),
getUid()
);
$this->validator= new UserRegisterValidator($this->data);
$this->mail= new UserRegisterMail($this->data);
}
/* Restituisco la giusta view al controller */
public function getView(){
$this->validator->extraValidation(
$this->nickExist(),
$this->emailExist()
);
if($this->validator->isValid()){
refresh('login.php');
$this->register();
deleteSession('security_code');
deleteSession('nickname');
deleteSession('username');
deleteSession('email');
$this->mail->send();
return new UserConfirmView(SENT_EMAIL);
}
else{
refresh('register.php');
deleteSession('security_code');
setSession('nickname',$this->data->nickname);
setSession('username',$this->data->username);
setSession('email',$this->data->email);
return new UserErrorView($this->validator->getErrors());
}
}
protected function register(){
$sql= "INSERT INTO users (user_ID, user_nick,user_name, user_password,user_email, user_confirm, user_is_admin, user_date, user_uid)
VALUES(NULL,:usernick,:username,MD5(:password),:email,'0','0',NOW(),:uid)";
$sth= $this->db->prepare($sql);
$excute= array(
':usernick'=>$this->data->nickname,
':username'=>$this->data->username,
':password'=>$this->data->password,
':email'=>$this->data->email,
':uid'=>$this->data->uid
);
$sth->execute($excute);
}
private function nickExist(){
$sql= "SELECT COUNT(user_ID) FROM users WHERE
user_nick=:nickname LIMIT 1";
$sth= $this->db->prepare($sql);
$excute= array(
':nickname'=>$this->data->nickname
);
$sth->execute($excute);
return (bool)$sth->fetchColumn();
}
private function emailExist(){
$sql= "SELECT COUNT(user_ID) FROM users WHERE
user_email=:email LIMIT 1";
$sth= $this->db->prepare($sql);
$excute= array(
':email'=>$this->data->email
);
$sth->execute($excute);
return (bool)$sth->fetchColumn();
}
/* Utilizzo __destruct per il garbage collection (cancellazione) degli
utenti che non hanno dato conferma della registrazione.
*/
final public function __destruct(){
$sql= "DELETE FROM users WHERE user_date + INTERVAL 1 DAY db->query($sql);
}
}
Da notare l'uso del metodo __destruct (richiamato automaticamente da Php) per cancellare gli utenti che non hanno confermato la registrazione.
UserRegisterView
Codice php:
class UserRegisterView extends UserView{
private $rememberNickname= '';
private $rememberUsername= '';
private $rememberEmail= '';
public function __construct($nickName,$username,$email){
$this->rememberNickname= $nickName;
$this->rememberUsername= $username;
$this->rememberEmail= $email;
$this->setView();
}
protected function setView(){
$captcha= 'captcha.php?'.time();
$this->xhtml=<<<EOD
<form action="{$_SERVER['PHP_SELF']}" method="post">
<fieldset><legend>Registrati</legend>
<label class="first" for="nickname">Scegli il tuo nickname<span class="required">*</span></label>
<input name="u_nickname" title="nickname" type="text" value="{$this->rememberNickname}" class="first" id="nickname" maxlength="15" tabindex="1" />
<br class="clean" />
<label for="username">Scegli il nome per il login<span class="required">*</span></label>
<input name="u_username" title="username" type="text" value="{$this->rememberUsername}" id="username" maxlength="15" tabindex="1" />
<br class="clean" />
<label for="password">Scegli la tua password<span class="required">*</span></label>
<input name="u_password" title="password" type="password" value="" id="password" maxlength="15" tabindex="2" />
<br class="clean" />
<label for="rpassword">Ripeti la password<span class="required">*</span></label>
<input name="u_rpassword" title="ripeti la password" type="password" value="" id="rpassword" maxlength="15" tabindex="3" />
<br class="clean" />
<label for="email">La tua email<span class="required">*</span></label>
<input name="u_email" title="email" type="text" value="{$this->rememberEmail}" id="email" maxlength="50" tabindex="4" />
<br class="clean" />
<p id="captcha-label">Inserisci le cifre che leggi nell'immagine<span class="required">*</span></p>
<p class="user-captcha"><input name="u_security" type="text" title="codice antispam" value="" id="security" maxlength="5" tabindex="5" /></p>
<p class="user-captcha"><img src="{$captcha}" alt="antispam" title="antispam" id="captcha-img" /></p>
<label for="send"> </label>
<input name="u_signup" title="Registrati" type="submit" value="Registrati" id="send" tabindex="6" />
<div id="user-wrapper">
<p id="user-msg">Nickname, username e password devono essere minimo 5 e massimo 15 caratteri, lettere e numeri solamente.<br />Riceverai al tuo indirizzo email la mail di conferma dell'iscrizione.
<br /><b>NB. </b>Per la registrazione occorre avere i cookies abilitati.</p>
<p id="user-left"></p>
<p id="user-right"><a href="login.php" title="login" class="user-link" tabindex="7">login</a></p>
</div>
</fieldset>
</form>
EOD;
}
}
UserRegisterController
Codice php:
class UserRegisterController extends UserController{
public function __construct($db){
parent::__construct($db);
$this->run();
}
protected function run(){
$formHasVar= formHasVar('u_nickname','u_username','u_password','u_rpassword','u_email','u_security','u_signup');
if(!$formHasVar){
$this->page= new UserPage(
REGISTER_ME,
new UserRegisterView(
getSession('nickname'),
getSession('username'),
getSession('email')
)
);
return;
}
$userRegisterModel= new UserRegisterModel($this->db);
$this->page= new UserPage(REGISTER_ME,$userRegisterModel->getView());
/* Dato che utilizziamo un redirect usciamo dallo script */
exit($this->getPage());
}
}
Per best pratice, utilizzando un redirect, sia per confermare l'invio della mail sia per segnalare errori commessi nella compilazione della form, terminiamo lo script con exit($this->getPage()).
Conclusioni
Da questo primo modulo puoi apprezzare la versabilità del MVC applicata ad un esempio concreto.
Puoi scaricare il nuovo modulo qui.Nel prossimo articolo parlerò della conferma della registrazione.