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 :

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

p> 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.

<%@ 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 mot de passe 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().

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.