Blogial

« Post precedente

Post successivo »


Semplice User Manager con il Model View Controller - Registrazione -

Metti al top

La registrazione dell'utente avviene mediante un modulo che spedisce una email all'indirizzo specificato, inviando un link per la conferma della stessa.

Al momento della spedizione della form, lo script oltre ad inserire i dati dell'utente, inserisce un uid che serve da seme/controllo per la conferma della registrazione tramite GET.

Al momento della conferma aggiorneremo l'uid associato e setteremo il campo user_confirm ad 1 nella tabella users permettendo il login al ns. nuovo utente.

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&nbsp;le&nbsp;cifre&nbsp;che&nbsp;leggi&nbsp;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">&nbsp;&nbsp;</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.

Inserisci il tuo commento

Inserisci il codice che leggi nell'immagine

antispam

Nb.
Devi avere i cookie abilitati per commentare l'articolo.
I commenti saranno soggetti ad approvazione da parte dell'administrator.

Gli articoli in evidenza

Php Trouble Tickets

Metti al top

Script opensource php mysql per la gestione delle richieste degli utenti tramite ticket.

Si tratta di un software gratuito che gira su piattaforme Linux, Windows (Apache).

Permette la completa gestione dei rapporti commerciali, tra voi e i vostri clienti, attraverso il sistema basato sui trouble tickets.

Distribuito sotto licenza MIT ha le seguenti caratteristiche:

  • - Valid css e xhtml strict;
  • - unobtrusive javascript utilizzando il framework jQuery;
  • - multilanguages;
  • - aggiungi/edita/cancella/chiudi/assegna trouble tickets e risposte;
  • - nessuna limitazione sul numero di utenti, amministratori e staff di supporto;
  • - permessi agli operatori, accesso separato utenti;
  • - gruppi di operatori con gestione permessi (CRUD);
  • - illimitate e nested categories;
  • - paging;
  • - moduli di ricerca;
  • - tables sortable;
  • - nessun limite sul numero di TT creabili.

Potete visionare una demo qui.