1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
<com:TContent ID="Main">
<h1>Création de la page de mise à jour des utilisateurs <tt>EditUser</tt></h1>
<p>
La page <tt>EditUser</tt> ressemble beaucoup à la page <a href="?page=Day3.CreateNewUser">NewUser</a>. La différence principale est le fait que lorsque la page <tt>EditUser</tt> est requise, les champs sont renseignés avec les données de l'utilisateur en cours. Une autre différence est que la page <tt>EditUser</tt> est accessible à un utilisateur standard.
</p>
<p>
Pour définir quels sont les comptes qui peuvent être modifiés, nous allons utiliser les règles suivantes :
</p>
<ul>
<li>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 : <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>.</li>
<li>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.</li>
<li>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.</li>
</ul>
<p>
Nous créons deux fichiers <tt>protected/pages/users/EditUser.page</tt> et <tt>protected/pages/users/EditUser.php</tt> qui contiendront respectivement le gabarit et la classe.
</p>
<h2>Création du gabarit</h2>
p>
Comme vous avez pu le deviner, la page <tt>EditUser</tt> est fortement ressemblante à la page <tt>NewUser</tt>. En dehors du titre de la page et du bouton "envoyer", il y a trois différences principales.
</p>
<ul>
<li>Le champ de saisie "username" est remplacé par un contrôle <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Label">TLabel</a> vu qu'il n'est pas autorisé de modifier son pseudo;</li>
<li>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.</li>
<li>Le champ "role" est entouré d'un <tt>TControl</tt>, 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.</li>
</ul>
<com:TTextHighlighter CssClass="source" Language="prado">
<%@ Title="Mon blog - Mise à jour utilisateur" %>
<com:TContent ID="Main">
<h1>Mise à jour utilisateur</h1>
<span>Pseudo:</span>
<com:TLabel ID="Username" />
<br/>
<span>Mot de passe:</span>
<br/>
<com:TTextBox ID="Password" TextMode="Password" />
<br/>
<span>Confirmation mot de passe:</span>
<com:TCompareValidator
ControlToValidate="Password"
ControlToCompare="Password2"
ErrorMessage="Différence entre le mot de passe et la confirmation."
Display="Dynamic" />
<br/>
<com:TTextBox ID="Password2" TextMode="Password" />
<br/>
<span>Email:</span>
<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" />
<br/>
<com:TTextBox ID="Email" />
<com:TControl Visible="<%= $this->User->IsAdmin %>">
<br/>
<span>Role:</span>
<br/>
<com:TDropDownList ID="Role">
<com:TListItem Text="Utilisateur standard" Value="0" />
<com:TListItem Text="Administrateur" Value="1" />
</com:TDropDownList>
</com:TControl>
<br/>
<span>Prénom:</span>
<br/>
<com:TTextBox ID="FirstName" />
<br/>
<span>Nom:</span>
<br/>
<com:TTextBox ID="LastName" />
<br/>
<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
</com:TContent>
</com:TTextHighlighter>
<h2>Création du fichier de classe</h2>
<p>
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 <tt>saveButtonClicked()</tt> appelée par l'évènement <tt>OnClick</tt> du bouton "Enregistrer".
</p>
<com:TTextHighlighter CssClass="source" Language="php">
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;
}
}
</com:TTextHighlighter>
<com:TipBox>
La méthode <tt>onInit()</tt> est appelée par PRADO lors du <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">cycle de vie de la page</a>. Les autres méthodes couramment surchargées sont <tt>onPreInit()</tt>, <tt>onLoad()</tt> et <tt>onPreRender()</tt>.
</com:TipBox>
<h2>Test</h2>
<p>
Pour tester la page <tt>EditUser</tt>, rendons-nous à l'URL <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>. 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.
</p>
</com:TContent>
|