Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Création de la page nouvel utilisateur <tt>NewUser</tt></h1>
4
 
5
<p>
6
La page <tt>NewUser</tt> 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 <a href="?page=Day2.CreateDB">base de données</a>, nous devons prévoir la saisie des informations suivantes :
7
</p>
8
 
9
<ul>
10
<li><tt>username</tt> - string, pseudo de l'utilisateur, obligatoire et unique</li>
11
<li><tt>email</tt> - string, email, obligatoire et unique</li>
12
<li><tt>password</tt> - string, mot de passe, obligatoire</li>
13
<li><tt>role</tt> - integer, rôle, obligatoire (0 ou 1)</li>
14
<li><tt>first_name</tt> - string, prénom, optionnel</li>
15
<li><tt>last_name</tt> - string, nom, optionnel</li>
16
</ul>
17
 
18
<p>
19
Nous créons deux fichiers, <tt>protected/pages/users/NewUser.page</tt> et <tt>protected/pages/users/NewUser.php</tt> qui contiendront respectivement le gabarit et la classe.
20
</p>
21
 
22
<h2>Création du gabarit</h2>
23
<p>
24
En fonction de l'analyse précédente, nous créons le gabarit comme ci-dessous :
25
</p>
26
 
27
<com:TTextHighlighter CssClass="source" Language="prado">
28
&lt;%@ Title="Mon Blog - Nouvel utilisateur" %>
29
 
30
&lt;com:TContent ID="Main">
31
 
32
<h1>Création nouvel utilisateur</h1>
33
 
34
<span>Pseudo:</span>
35
&lt;com:TRequiredFieldValidator
36
    ControlToValidate="Username"
37
    ErrorMessage="Veuillez indiquer un pseudo."
38
    Display="Dynamic" />
39
&lt;com:TCustomValidator
40
    ControlToValidate="Username"
41
    ErrorMessage="Désolé, le pseudo choisi est déjà utilisé. Veuillez en saisir un autre."
42
    OnServerValidate="checkUsername"
43
    Display="Dynamic" />
44
<br/>
45
&lt;com:TTextBox ID="Username" />
46
 
47
<br/>
48
<span>Mot de passe:</span>
49
&lt;com:TRequiredFieldValidator
50
    ControlToValidate="Password"
51
    ErrorMessage="Veuillez indiquer un mot de passe."
52
    Display="Dynamic" />
53
<br/>
54
&lt;com:TTextBox ID="Password" TextMode="Password" />
55
 
56
<br/>
57
<span>Confirmation mot de passe:</span>
58
&lt;com:TCompareValidator
59
    ControlToValidate="Password"
60
    ControlToCompare="Password2"
61
    ErrorMessage="Différence entre le mot de passe et la confirmation."
62
    Display="Dynamic" />
63
<br/>
64
&lt;com:TTextBox ID="Password2" TextMode="Password" />
65
 
66
<br/>
67
<span>Email:</span>
68
&lt;com:TRequiredFieldValidator
69
    ControlToValidate="Email"
70
    ErrorMessage="Veuillez indiquer votre email."
71
    Display="Dynamic" />
72
&lt;com:TEmailAddressValidator
73
    ControlToValidate="Email"
74
    ErrorMessage="Vous avez indiqué un mot de passe invalide."
75
    Display="Dynamic" />
76
<br/>
77
&lt;com:TTextBox ID="Email" />
78
 
79
<br/>
80
<span>Rôle:</span>
81
<br/>
82
&lt;com:TDropDownList ID="Role">
83
    &lt;com:TListItem Text="Utilisateur standard" Value="0" />
84
    &lt;com:TListItem Text="Administrateur" Value="1" />
85
&lt;/com:TDropDownList>
86
 
87
<br/>
88
<span>Prénom:</span>
89
<br/>
90
&lt;com:TTextBox ID="FirstName" />
91
 
92
<br/>
93
<span>Nom:</span>
94
<br/>
95
&lt;com:TTextBox ID="LastName" />
96
 
97
<br/>
98
&lt;com:TButton Text="Ajouter" OnClick="createButtonClicked" />
99
 
100
&lt;/com:TContent>
101
</com:TTextHighlighter>
102
 
103
<p>
104
Le gabarit est très proche du gabarit de la page <tt>Contact</tt> et de la page <tt>LoginUser</tt>. 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.
105
</p>
106
 
107
 
108
<h2>Création du fichier de classe</h2>
109
 
110
<p>
111
En fonction du gabarit précédent, nous constatons que nous avons besoin d'une classe qui implémente deux gestionnaires d'évènements : <tt>checkUsername()</tt> (appellé par le premier validateur dans l'évènement <tt>OnServerValidate</tt>) et <tt>createButtonClicked()</tt> (appellé par l'évènement <tt>OnClick</tt> du bouton "create"). ainsi, nous écrirons la classe comme ci-dessous :
112
</p>
113
 
114
<com:TTextHighlighter CssClass="source" Language="php">
115
class NewUser extends TPage
116
{
117
    /**
118
     * Vérifie si le nom d'utilisateur existe dans la base de données.
119
     * Cette méthode répond à l'évènement OnServerValidate du validateur username.
120
     * @param mixed sender : celui qui a généré l'évènement
121
     * @param mixed param : paramètres de l'évènement
122
     */
123
    public function checkUsername($sender,$param)
124
    {
125
        // valide si l'utilisateur existe
126
        $param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null;
127
    }
128
 
129
    /**
130
     * Créer un nouveau compte utilisateur si tous les champs sont valides.
131
     * Cette méthode répond à l'évènement OnClick du bouton "create".
132
     * @param mixed sender : celui qui a généré l'évènement
133
     * @param mixed param : paramètres de l'évènement
134
     */
135
    public function createButtonClicked($sender,$param)
136
    {
137
        if($this->IsValid)  // si toutes les validations sont ok
138
        {
139
            // rempli l'objet UserRecord avec les données saisies
140
            $userRecord=new UserRecord;
141
            $userRecord->username=$this->Username->Text;
142
            $userRecord->password=$this->Password->Text;
143
            $userRecord->email=$this->Email->Text;
144
            $userRecord->role=(int)$this->Role->SelectedValue;
145
            $userRecord->first_name=$this->FirstName->Text;
146
            $userRecord->last_name=$this->LastName->Text;
147
 
148
            // l'enregistre dans la base de données par la méthode save de l'Active Record
149
            $userRecord->save();
150
 
151
            // redirige l'utilisateur vers la page d'accueil
152
			$this->Response->redirect($this->Service->DefaultPageUrl);
153
        }
154
    }
155
}
156
</com:TTextHighlighter>
157
 
158
<p>
159
Dans le code précédent, l'appel à la méthode <tt>save()</tt> insère un enregistrement dans la table <tt>users</tt>. Cette fonctionnalité est fournie par l'objet <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
160
</p>
161
 
162
<com:NoteBox>
163
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 <a href="?page=Day3.Auth">authentification</a>. De même, les espaces en début et fin de pseudo devrait être supprimés.
164
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 <a href="?page=Day3.Auth">authentification</a>. De même les espaces en début et fin de pseudo devrait être supprimés.
165
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 <a href="?page=Day3.Auth">authentification</a>. De même les espaces en début et fin de pseudo devrait être supprimés.
166
</com:NoteBox>
167
 
168
 
169
<h2>Test</h2>
170
<p>
171
Pour tester la page <tt>NewUser</tt>, il suffit de naviguer à l'URL <tt>http://hostname/blog/index.php?page=users.NewUser</tt>. 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.
172
</p>
173
 
174
<img src="<%~ output2.gif %>" class="output"/>
175
 
176
 
177
<h2>Ajout de la vérification des droits d'accès</h2>
178
<p>
179
Durant le test, vous vous êtes peut-être demandé : Est-ce que la page <tt>NewUser</tt> ne devrait être accessible qu'aux administrateurs ? Oui, ceci est dénommé <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Auth">autorisation</a>. Nous allons maintenant décrire comment ajouter cette vérification d'accès à la page <tt>NewUser</tt>.
180
</p>
181
 
182
<p>
183
Une façon simple serait de vérifier dans le code de la classe si <tt>$this->User->IsAdmin</tt> est vrai, dans le cas contraire, une redirection vers la page de connexion <tt>LoginUser</tt> serait faite.
184
</p>
185
 
186
<p>
187
PRADO propose une approche complémentaire de vérification des droits. Pour ce faire, nous devons utiliser un fichier de <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">configuration de page</a>. Créer un fichier <tt>protected/pages/users/config.xml</tt> avec le contenu suivant :
188
</p>
189
 
190
<com:TTextHighlighter CssClass="source" Language="xml">
191
<?xml version="1.0" encoding="utf-8"?>
192
<configuration>
193
  <authorization>
194
    <allow roles="admin" />
195
    <deny users="*" />
196
  </authorization>
197
</configuration>
198
</com:TTextHighlighter>
199
 
200
<p>
201
Le fichier de configuration de page contient les règles d'accès aux pages contenues dans le dossier <tt>protected/pages/users</tt>. Ce fichier indique que les utilisateurs dont le rôle est "admin" (concernant le mot "admin" voir <a href="?page=Day3.Auth">BlogUser.createUser()</a>) peuvent accéder à toutes les pages du dossier. Tous les autres utilisateurs (<tt>users="*"</tt>) ne sont pas autorisés à accéder à ces pages, excepté à la page <tt>LoginUser</tt> qui, par convention, peut toujours être chargée.
202
</p>
203
 
204
<p>
205
Dorénavant, si nous naviguons à la page <tt>NewUser</tt> en tant qu'anonyme, nous serons redirigés vers la page <tt>LoginUser</tt>. Si notre connexion est acceptée, nous serons redirigés en retour vers la page <tt>NewUser</tt>
206
</p>
207
 
208
<com:TipBox>
209
Le fichier de configuration de pages peut contenir d'autres éléments que les règles d'autorisations. Par exemple, il pourrait inclure un <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">module</a> tout comme nous l'avons fait pour le fichier de <a href="?page=Day2.ConnectDB">configuration de l'application</a>. 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.
210
</com:TipBox>
211
 
212
</com:TContent>