Création de la page de mise à jour des utilisateurs EditUser
La page EditUser ressemble beaucoup à la page NewUser. La différence principale est le fait que lorsque la page EditUser est requise, les champs sont renseignés avec les données de l'utilisateur en cours. Une autre différence est que la page EditUser est accessible à un utilisateur standard.
Pour définir quels sont les comptes qui peuvent être modifiés, nous allons utiliser les règles suivantes :
- Si l'utilisateur actuel est un administrateur, il peut modifier n'importe quel compte utilisateur en spécifiant le pseudo de l'utilisateur dans l'URL sous la forme ?username='le nom'. Par exemple : http://hostname/blog/index.php?page=users.EditUser&username=demo.
- Si l'utilisateur actuel est un administrateur et qu'il n'a pas précisé d'username, ce sont les informations de l'administrateur qui seront mise à jour.
- Si l'utilisateur actuel est un utilisateur standard, seules les données de son compte seront accessibles et il ne pourra pas modifier son rôle.
Nous créons deux fichiers protected/pages/users/EditUser.page et protected/pages/users/EditUser.php qui contiendront respectivement le gabarit et la classe.
Création du gabarit
Comme vous avez pu le deviner, la page EditUser est fortement ressemblante à la page NewUser. En dehors du titre de la page et du bouton "envoyer", il y a trois différences principales.
- Le champ de saisie "username" est remplacé par un contrôle TLabel vu qu'il n'est pas autorisé de modifier son pseudo;
- Le validateur pour le champ "password" est supprimé. Si l'utilisateur ne fournit pas de mot de passe durant la modification, cela indique que l'utilisateur ne veut pas en changer.
- Le champ "role" est entouré d'un TControl, ce qui nous permet de la rendre visible ou invisible en fonction de rôle de l'utilisateur connecté. Si l'utilisateur n'est pas un administrateur, le champ "role" ne sera pas affiché. Les utilisateurs standard n'ont pas le droit de modifier leur rôle.
<%@ Title="Mon blog - Mise à jour utilisateur" %>
<com:TContent ID="Main">
Mise à jour utilisateur
Pseudo:
<com:TLabel ID="Username" />
Mot de passe:
<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 email invalide."
Display="Dynamic" />
<com:TTextBox ID="Email" />
<com:TControl Visible="<%= $this->User->IsAdmin %>">
Role:
<com:TDropDownList ID="Role">
<com:TListItem Text="Utilisateur standard" Value="0" />
<com:TListItem Text="Administrateur" Value="1" />
</com:TDropDownList>
</com:TControl>
Prénom:
<com:TTextBox ID="FirstName" />
Nom:
<com:TTextBox ID="LastName" />
<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
</com:TContent>
Création du fichier de classe
En suivant les indications du gabarit, nous devons écrire une page de classe qui initialise les champs avec les données de l'utilisateur. De plus, la classe doit implémenter la méthode saveButtonClicked() appelée par l'évènement OnClick du bouton "Enregistrer".
class EditUser extends TPage
{
/**
* Initialise les champs avec les données de l'utilisateur.
* Cette méthode est appelée par le framework lorsque la page est initialisée.
* @param mixed param : paramètres de l'évènement
*/
public function onInit($param)
{
parent::onInit($param);
if(!$this->IsPostBack) // est-ce que c'est le premier appel à la page
{
// Lit les informations de l'utilisateur. C'est équivalent à :
// $userRecord=$this->getUserRecord();
$userRecord=$this->UserRecord;
// Rempli les contrôles avec les données de l'utilisateur
$this->Username->Text=$userRecord->username;
$this->Email->Text=$userRecord->email;
$this->Role->SelectedValue=$userRecord->role;
$this->FirstName->Text=$userRecord->first_name;
$this->LastName->Text=$userRecord->last_name;
}
}
/**
* Enregistre les modifications si tous les validateurs sont Ok.
* Cette méthode répond à l'évènement OnClick du bouton "Enregistrer".
* @param mixed sender : celui qui a généré l'évènement
* @param mixed param : paramètres de l'évènement
*/
public function saveButtonClicked($sender,$param)
{
if($this->IsValid) // toutes les validations Ok ?
{
// Lit les informations de l'utilisateur.
$userRecord=$this->UserRecord;
// Enresgistre les valeurs dans les champs de la BDD
$userRecord->username=$this->Username->Text;
// mets à jour le mot de passe s'il n'est pas vide
if(!empty($this->Password->Text))
$userRecord->password=$this->Password->Text;
$userRecord->email=$this->Email->Text;
// mets à jour le rôle si l'utilisateur actuel est un administrateur
if($this->User->IsAdmin)
$userRecord->role=(int)$this->Role->SelectedValue;
$userRecord->first_name=$this->FirstName->Text;
$userRecord->last_name=$this->LastName->Text;
// enregistre les modifications dans la BDD
$userRecord->save();
// redirige vers la page d'accueil
$this->Response->redirect($this->Service->DefaultPageUrl);
}
}
/**
* Retourne l'utilisateur qui doit être mis à jour.
* @return UserRecord l'utilisateur qui doit être modifié.
* @throws THttpException si l'utilisateur n'existe pas.
*/
protected function getUserRecord()
{
// l'utilisateur à modifié est l'utilisateur actuellement connecté
$username=$this->User->Name;
// si la variable GET 'username' n'est pas vide et que l'utilisateur actuel
// est un administrateur, nous utilisons la variable GET à la place
if($this->User->IsAdmin && $this->Request['username']!==null)
$username=$this->Request['username'];
// lit les données de l'utilisateur par Active Record
$userRecord=UserRecord::finder()->findByPk($username);
if(!($userRecord instanceof UserRecord))
throw new THttpException(500,'Username is invalid.');
return $userRecord;
}
}
La méthode onInit() est appelée par PRADO lors du cycle de vie de la page. Les autres méthodes couramment surchargées sont onPreInit(), onLoad() et onPreRender().
Ajout de la vérification des droits d'accès
Pour rendre la page EditUser accessible également par les utilisateurs authentifiés (users="@"), nous devons modifier le fichier de configuration protected/pages/users/config.xml.
Test
Pour tester la page EditUser, rendons-nous à l'URL http://hostname/blog/index.php?page=users.EditUser&username=demo. Il vous sera peut-être demandé de vous authentifier auparavant si vous n'êtes pas déjà connecté. Essayez de vous connecter avec différents comptes (ie: admin/demo, demo/demo) et remarquez comment la page évolue différemment.