Création de la page nouvel utilisateur NewUser
La page NewUser est fournie à l'administrateur pour créer des nouveaux comptes utilisateurs. Elle doit afficher un formulaire qui permet la saisie des informations d'un nouveau compte. Tel que défini dans la base de données, nous devons prévoir la saisie des informations suivantes :
- username - string, pseudo de l'utilisateur, obligatoire et unique
- email - string, email, obligatoire et unique
- password - string, mot de passe, obligatoire
- role - integer, rôle, obligatoire (0 ou 1)
- first_name - string, prénom, optionnel
- last_name - string, nom, optionnel
Nous créons deux fichiers, protected/pages/users/NewUser.page et protected/pages/users/NewUser.php qui contiendront respectivement le gabarit et la classe.
Création du gabarit
En fonction de l'analyse précédente, nous créons le gabarit comme ci-dessous :
<%@ Title="Mon Blog - Nouvel utilisateur" %>
<com:TContent ID="Main">
Création nouvel utilisateur
Pseudo:
<com:TRequiredFieldValidator
ControlToValidate="Username"
ErrorMessage="Veuillez indiquer un pseudo."
Display="Dynamic" />
<com:TCustomValidator
ControlToValidate="Username"
ErrorMessage="Désolé, le pseudo choisi est déjà utilisé. Veuillez en saisir un autre."
OnServerValidate="checkUsername"
Display="Dynamic" />
<com:TTextBox ID="Username" />
Mot de passe:
<com:TRequiredFieldValidator
ControlToValidate="Password"
ErrorMessage="Veuillez indiquer un mot de passe."
Display="Dynamic" />
<com:TTextBox ID="Password" TextMode="Password" />
Confirmation mot de passe:
<com:TCompareValidator
ControlToValidate="Password"
ControlToCompare="Password2"
ErrorMessage="Différence entre le mot de passe et la confirmation."
Display="Dynamic" />
<com:TTextBox ID="Password2" TextMode="Password" />
Email:
<com:TRequiredFieldValidator
ControlToValidate="Email"
ErrorMessage="Veuillez indiquer votre email."
Display="Dynamic" />
<com:TEmailAddressValidator
ControlToValidate="Email"
ErrorMessage="Vous avez indiqué un mot de passe invalide."
Display="Dynamic" />
<com:TTextBox ID="Email" />
Rôle:
<com:TDropDownList ID="Role">
<com:TListItem Text="Utilisateur standard" Value="0" />
<com:TListItem Text="Administrateur" Value="1" />
</com:TDropDownList>
Prénom:
<com:TTextBox ID="FirstName" />
Nom:
<com:TTextBox ID="LastName" />
<com:TButton Text="Ajouter" OnClick="createButtonClicked" />
</com:TContent>
Le gabarit est très proche du gabarit de la page Contact et de la page LoginUser. Il consiste principalement en deux champs de saisie et de plusieurs validateurs. Certains champs de saisie sont associés à plusieurs validateurs vu qu'il est nécessaire de vérifier plusieurs règles.
Création du fichier de classe
En fonction du gabarit précédent, nous constatons que nous avons besoin d'une classe qui implémente deux gestionnaires d'évènements : checkUsername() (appellé par le premier validateur dans l'évènement OnServerValidate) et createButtonClicked() (appellé par l'évènement OnClick du bouton "create"). ainsi, nous écrirons la classe comme ci-dessous :
class NewUser extends TPage
{
/**
* Vérifie si le nom d'utilisateur existe dans la base de données.
* Cette méthode répond à l'évènement OnServerValidate du validateur username.
* @param mixed sender : celui qui a généré l'évènement
* @param mixed param : paramètres de l'évènement
*/
public function checkUsername($sender,$param)
{
// valide si l'utilisateur existe
$param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null;
}
/**
* Créer un nouveau compte utilisateur si tous les champs sont valides.
* Cette méthode répond à l'évènement OnClick du bouton "create".
* @param mixed sender : celui qui a généré l'évènement
* @param mixed param : paramètres de l'évènement
*/
public function createButtonClicked($sender,$param)
{
if($this->IsValid) // si toutes les validations sont ok
{
// rempli l'objet UserRecord avec les données saisies
$userRecord=new UserRecord;
$userRecord->username=$this->Username->Text;
$userRecord->password=$this->Password->Text;
$userRecord->email=$this->Email->Text;
$userRecord->role=(int)$this->Role->SelectedValue;
$userRecord->first_name=$this->FirstName->Text;
$userRecord->last_name=$this->LastName->Text;
// l'enregistre dans la base de données par la méthode save de l'Active Record
$userRecord->save();
// redirige l'utilisateur vers la page d'accueil
$this->Response->redirect($this->Service->DefaultPageUrl);
}
}
}
Dans le code précédent, l'appel à la méthode save() insère un enregistrement dans la table users. Cette fonctionnalité est fournie par l'objet Active Record.
Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie authentification. De même, les espaces en début et fin de pseudo devrait être supprimés.
Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie authentification. De même les espaces en début et fin de pseudo devrait être supprimés.
Par simplification, le pseudo dans notre blog est sensible à la casse. Dans beaucoup de systèmes, le pseudo est insensible à la casse. Il faudrait donc prévoir un traitement particulier lors de la création d'un nouvel utilisateur, ainsi que dans la partie authentification. De même les espaces en début et fin de pseudo devrait être supprimés.
Test
Pour tester la page NewUser, il suffit de naviguer à l'URL http://hostname/blog/index.php?page=users.NewUser. vous devriez voir apparaitre la page suivante. Essayez de saisir différentes informations et remarquez comment les données sont validées. Si toutes les règles sont valides, nous devrions avoir inséré un nouvel utilisateur et être redirigés vers la page d'accueil.
Ajout de la vérification des droits d'accès
Durant le test, vous vous êtes peut-être demandé : Est-ce que la page NewUser ne devrait être accessible qu'aux administrateurs ? Oui, ceci est dénommé autorisation. Nous allons maintenant décrire comment ajouter cette vérification d'accès à la page NewUser.
Une façon simple serait de vérifier dans le code de la classe si $this->User->IsAdmin est vrai, dans le cas contraire, une redirection vers la page de connexion LoginUser serait faite.
PRADO propose une approche complémentaire de vérification des droits. Pour ce faire, nous devons utiliser un fichier de configuration de page. Créer un fichier protected/pages/users/config.xml avec le contenu suivant :
Le fichier de configuration de page contient les règles d'accès aux pages contenues dans le dossier protected/pages/users. Ce fichier indique que les utilisateurs dont le rôle est "admin" (concernant le mot "admin" voir BlogUser.createUser()) peuvent accéder à toutes les pages du dossier. Tous les autres utilisateurs (users="*") ne sont pas autorisés à accéder à ces pages, excepté à la page LoginUser qui, par convention, peut toujours être chargée.
Dorénavant, si nous naviguons à la page NewUser en tant qu'anonyme, nous serons redirigés vers la page LoginUser. Si notre connexion est acceptée, nous serons redirigés en retour vers la page NewUser
Le fichier de configuration de pages peut contenir d'autres éléments que les règles d'autorisations. Par exemple, il pourrait inclure un module tout comme nous l'avons fait pour le fichier de configuration de l'application. Dans une application PRADO, chaque dossier de pages peut contenir un fichier de configuration de pages qui s'applique à tous les fichiers du dossier ainsi qu'aux sous dossiers.