From 654a9cae43358c7eecf3b522e9876aa7815e2453 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Mon, 7 Dec 2015 15:57:51 +0100 Subject: Move urls from pradosoft.com to github's project page; drop unmaintained quickstart tutorial translations --- demos/blog-tutorial/protected/pages/Day3/Auth.page | 8 +- .../protected/pages/Day3/CreateAdminUser.page | 12 +- .../protected/pages/Day3/CreateEditUser.page | 4 +- .../protected/pages/Day3/CreateLoginUser.page | 2 +- .../protected/pages/Day3/CreateNewUser.page | 8 +- .../protected/pages/Day3/fr/Auth.page | 106 ---------- .../protected/pages/Day3/fr/CreateAdminUser.page | 144 -------------- .../protected/pages/Day3/fr/CreateEditUser.page | 215 --------------------- .../protected/pages/Day3/fr/CreateLoginUser.page | 161 --------------- .../protected/pages/Day3/fr/CreateNewUser.page | 212 -------------------- .../protected/pages/Day3/fr/Overview.page | 42 ---- .../protected/pages/Day3/fr/directories.gif | Bin 10329 -> 0 bytes .../protected/pages/Day3/fr/output.gif | Bin 10006 -> 0 bytes .../protected/pages/Day3/fr/output2.gif | Bin 9222 -> 0 bytes .../protected/pages/Day3/fr/output3.gif | Bin 9464 -> 0 bytes .../protected/pages/Day3/id/Auth.page | 102 ---------- .../protected/pages/Day3/id/CreateAdminUser.page | 137 ------------- .../protected/pages/Day3/id/CreateEditUser.page | 212 -------------------- .../protected/pages/Day3/id/CreateLoginUser.page | 162 ---------------- .../protected/pages/Day3/id/CreateNewUser.page | 210 -------------------- .../protected/pages/Day3/id/Overview.page | 26 --- .../protected/pages/Day3/id/directories.gif | Bin 10329 -> 0 bytes .../protected/pages/Day3/id/output.gif | Bin 10006 -> 0 bytes .../protected/pages/Day3/id/output2.gif | Bin 9222 -> 0 bytes .../protected/pages/Day3/id/output3.gif | Bin 9464 -> 0 bytes 25 files changed, 17 insertions(+), 1746 deletions(-) delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/Auth.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/Overview.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/directories.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/output.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/output2.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/fr/output3.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/Auth.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/Overview.page delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/directories.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/output.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/output2.gif delete mode 100755 demos/blog-tutorial/protected/pages/Day3/id/output3.gif (limited to 'demos/blog-tutorial/protected/pages/Day3') diff --git a/demos/blog-tutorial/protected/pages/Day3/Auth.page b/demos/blog-tutorial/protected/pages/Day3/Auth.page index 8d066b24..2eacd4be 100755 --- a/demos/blog-tutorial/protected/pages/Day3/Auth.page +++ b/demos/blog-tutorial/protected/pages/Day3/Auth.page @@ -3,7 +3,7 @@

Authentication and Authorization

-Before we set off to implement the user pages, we need to do some work to enable authentication and authorization. +Before we set off to implement the user pages, we need to do some work to enable authentication and authorization.

@@ -26,11 +26,11 @@ We add two new modules to the application configuration as follows:

-The TAuthManager module manages the whole authentication and authorization workflow. It uses the users module as its user manager (see below). By specifying the LoginPage property, we inform the auth manager to redirect user's browser to the LoginUser page when an authorization fails. We will describe how to create LoginUser in the next subsection. +The TAuthManager module manages the whole authentication and authorization workflow. It uses the users module as its user manager (see below). By specifying the LoginPage property, we inform the auth manager to redirect user's browser to the LoginUser page when an authorization fails. We will describe how to create LoginUser in the next subsection.

-The user module is of class TDbUserManager which is responsible to verify the validity of a user and keep basic user data in the PHP session. The UserClass property is initialized as Application.BlogUser, which indicates the user manager would look for a BlogUser class under the directory protected (remember the alias Application refers to the protected directory) and use it to keep user's session data. +The user module is of class TDbUserManager which is responsible to verify the validity of a user and keep basic user data in the PHP session. The UserClass property is initialized as Application.BlogUser, which indicates the user manager would look for a BlogUser class under the directory protected (remember the alias Application refers to the protected directory) and use it to keep user's session data.

@@ -38,7 +38,7 @@ As we will see in later sections, in controls and pages, we can use $this->U

-Below is the implementation detail of BlogUser. Notice Active Record is used to perform DB query. For example, we use UserRecord::finder()->findByPk($username) to look for the primary key specified by $username in the users table. +Below is the implementation detail of BlogUser. Notice Active Record is used to perform DB query. For example, we use UserRecord::finder()->findByPk($username) to look for the primary key specified by $username in the users table.

diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page index a278fa69..06e3dbdc 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateAdminUser.page @@ -22,13 +22,13 @@ We create two files protected/pages/users/AdminUser.page and protec

Creating Page Template

-We use TDataGrid to display the user accounts. Based on the above analysis, we configure the following four columns: +We use TDataGrid to display the user accounts. Based on the above analysis, we configure the following four columns:

    -
  • THyperLinkColumn displays the username column. The URL is constructed according to the PHP expression specified in the DataNavigateUrlFormatString property.
  • -
  • TBoundColumn displays the email column.
  • -
  • TCheckBoxColumn uses checkboxes to indicate whether a user account is of role administrator.
  • -
  • TButtonColumn displays a column of "Delete" buttons.
  • +
  • THyperLinkColumn displays the username column. The URL is constructed according to the PHP expression specified in the DataNavigateUrlFormatString property.
  • +
  • TBoundColumn displays the email column.
  • +
  • TCheckBoxColumn uses checkboxes to indicate whether a user account is of role administrator.
  • +
  • TButtonColumn displays a column of "Delete" buttons.

The complete page template is shown as follows:

@@ -123,7 +123,7 @@ In the above, the deleteButtonClicked() method is invoked whenever a "D

-All data-bound controls have similar usage pattern. That is, set the DataSource property with the data and call dataBind() method to binds the data to the control's internal structure. +All data-bound controls have similar usage pattern. That is, set the DataSource property with the data and call dataBind() method to binds the data to the control's internal structure. diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page index 6023450c..e6fd16e1 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateEditUser.page @@ -24,7 +24,7 @@ We create two files protected/pages/users/EditUser.page and protect As you may have guessed, the page template EditUser is largely the same as that of NewUser. Besides the difference in page title and the caption of the submit button, there are three main differences.

    -
  • The "username" text box is replaced by a TLabel control because we do not allow modifying username;
  • +
  • The "username" text box is replaced by a TLabel control because we do not allow modifying username;
  • The validator for the "password" input is removed. This is because if the user does not provide a password during editting, it means the user does not want to change the password.
  • The "role" input is surrounded with TControl whose visibility is toggled according to the role of the currently logged-in user. If the user is not an administrator, the "role" input will not be displayed because normal users are not allowed to modify their roles.
@@ -184,7 +184,7 @@ class EditUser extends TPage
-The onInit() method is invoked by PRADO during one of the page lifecycles. Other commonly overriden lifecycle methods include onPreInit(), onLoad() and onPreRender(). +The onInit() method is invoked by PRADO during one of the page lifecycles. Other commonly overriden lifecycle methods include onPreInit(), onLoad() and onPreRender().

Adding Permission Check

diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page index 66d7dc80..d3a48e44 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateLoginUser.page @@ -23,7 +23,7 @@ We create two files protected/pages/users/LoginUser.page and protec

Creating Page Template

-Below we show the template for LoginUser. As we see, the page mainly contains a text box for collecting username and a text box for password. The username input is required, which is ensured by the TRequiredFieldValidator. The correctness of the password input is ensured by the TCustomValidator which invokes the page's validateUser() method when validation is performed. The page also has "login" button which invokes the page's loginButtonClicked() when it is clicked. +Below we show the template for LoginUser. As we see, the page mainly contains a text box for collecting username and a text box for password. The username input is required, which is ensured by the TRequiredFieldValidator. The correctness of the password input is ensured by the TCustomValidator which invokes the page's validateUser() method when validation is performed. The page also has "login" button which invokes the page's loginButtonClicked() when it is clicked.

diff --git a/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page index 4dca21c2..06953fe2 100755 --- a/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page +++ b/demos/blog-tutorial/protected/pages/Day3/CreateNewUser.page @@ -156,7 +156,7 @@ class NewUser extends TPage

-In the above, calling save() will insert a new row in the users table. This intuitive feature is enabled by Active Record. +In the above, calling save() will insert a new row in the users table. This intuitive feature is enabled by Active Record.

@@ -174,7 +174,7 @@ To test the NewUser page, visit the URL http://hostname/blog/index.

Adding Permission Check

-During testing, you may have asked: shouldn't the NewUser page be only accessible by the administrator user? Yes, this is called authorization. We now describe how we add this permission check to the NewUser page. +During testing, you may have asked: shouldn't the NewUser page be only accessible by the administrator user? Yes, this is called authorization. We now describe how we add this permission check to the NewUser page.

@@ -182,7 +182,7 @@ A straightforward way of performing permission check is in the page class where

-PRADO offers a more systematic way of checking page access permissions. To do so, we need to use page configuration. Create a file protected/pages/users/config.xml with the content as follows: +PRADO offers a more systematic way of checking page access permissions. To do so, we need to use page configuration. Create a file protected/pages/users/config.xml with the content as follows:

@@ -204,7 +204,7 @@ Now if we visit the NewUser page as a guest, we will be redirected to t

-Page configuration can contain more than authorization rules. For example, it can include modules like we did in the application configuration. For a PRADO application, each page directory can have a page configuration which applies to the pages in the same directory and all its subdirectories. +Page configuration can contain more than authorization rules. For example, it can include modules like we did in the application configuration. For a PRADO application, each page directory can have a page configuration which applies to the pages in the same directory and all its subdirectories. \ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page b/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page deleted file mode 100755 index 0cced90b..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/Auth.page +++ /dev/null @@ -1,106 +0,0 @@ - - -

Authentification et Autorisation

- - -

-Avant que nous n'implémentions la gestion des utilisateurs, nous devons activer les modules authentification et autorisation. -

- - -

-Nous ajoutons deux nouveaux modules à notre fichier de configuration de l'application. -

- - - - ...modules TDataSourceConfig et TActiveRecordConfig ... - - - - - - - -

-Le module TAuthManager gère le processus d'authentification et d'autorisation. Il utilise le module users comme gestionnaire d'utilisateur (voir ci-après). En spécifiant la propriété LoginPage, nous indiquons au module d'authentification de rediriger vers la page LoginUser quand il est nécessaire de s'authentifier. Nous décrirons comment créer la page LoginUser ci-après. -

- -

-Le module user est une classe de type TDbUserManager qui est responsable de la vérification et de la validation des utilisateurs et qui enregistre dans une session PHP les données utilisateurs. La propriété UserClass est initialisée comme étant de type Application.BlogUser, ceci indique au module user de chercher une classe BlogUser dans le dossier protected (rappellez-vous que l'alias Application fait référence au dossier protected) et d'utiliser cette classe pour conserver les données utilisateurs dans une session. -Le module user est une classe de type TDbUserManager qui est responsable de la vérification et de la validation des utilisateurs et qui enregistre dans une session PHP les données utilisateurs. La propriété UserClass est initialisée comme étant de type Application.BlogUser, ceci indique au module user de chercher une classe BlogUser dans le dossier protected (rappellez-vous que l'alias Application fait référence au dossier protected) et d'utilisez cette classe pour conserver les données utilisateurs dans une session. -

- -

-Comme vous pourrez le constater dans les sections suivantes, dans les différents contrôles et pages, nous pourrons utiliser $this->User pour accéder à l'objet qui contient les informations de l'utilisateur actuellement connecté. -

- - -

-Ci-dessous les détails de l'implémentation de la classe BlogUser. Remarquez que les Active Record sont utilisés pour exécuter une requête. Par exemple, nous utilisons UserRecord::finder()->findByPk($username) pour chercher la valeur de $username dans la table users et ceci par la clé primaire. -

- - -// Include TDbUserManager.php file which defines TDbUser -Prado::using('System.Security.TDbUserManager'); - -/** - * La classe BlogUser. - * BlogUser représente les données utilisateurs à conserver en session. - * L'implémentation par défaut conserve le nom et le rôle de l'utilisateur. - */ -class BlogUser extends TDbUser -{ - /** - * Créer un objet de type BlogUser basé sur le nom de l'utilisateur. - * Cette méthode est requise par TDbUser. Cet objet vérifie si l'utilisateur - * est bien présent en base de données. Si oui, un objet BlogUser - * est créé et initialisé. - * @param string le nom de l'utilisateur - * @return l'objet BlogUser, null si le nom de l'utilisateur est invalide. - */ - public function createUser($username) - { - // utilise l'Active Record UserRecord pour chercher l'utilisateur username - $userRecord=UserRecord::finder()->findByPk($username); - if($userRecord instanceof UserRecord) // si trouvé - { - $user=new BlogUser($this->Manager); - $user->Name=$username; // enregistre le nom de l'utilisateur - $user->Roles=($userRecord->role==1?'admin':'user'); // et son rôle - $user->IsGuest=false; // l'utilisateur n'est pas un invité - return $user; - } - else - return null; - } - - /** - * Vérifie que le nom d'utilisateur et son mot de passe sont correct. - * Cette méthode est requise par TDbUser. - * @param string le nom de l'utilisateur - * @param string le mot de passe - * @return boolean en fonction de la validité de la vérification. - */ - public function validateUser($username,$password) - { - // utilise l'Active Record UserRecord pour vérifier le nom d'utilisateur couplé au mot de passe. - return UserRecord::finder()->findBy_username_AND_password($username,$password)!==null; - } - - /** - * @return boolean indiquant si l'utilisateur est un administrateur. - */ - public function getIsAdmin() - { - return $this->isInRole('admin'); - } -} - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page deleted file mode 100755 index 7cb8fef8..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateAdminUser.page +++ /dev/null @@ -1,144 +0,0 @@ - - -

Création de la page d'administration des utilisateurs AdminUser

- -

-La page AdminUser affiche la liste de tous les comptes utilisateurs, ainsi l'administrateur peut effectuer les tâches de maintenance. Par simplification, les tâches administratives pour notre blog seront la mise à jour des utilisateurs et la suppression. -

- - -

-Nous allons lister les utilisateurs dans une table HTML. Chaque ligne correspondra à un compte utilisateur, les colonnes suivantes seront affichées: -

- -
    -
  • Pseudo - affiche le pseudo de l'utilisateur. Dans chaque cellule un lien sera affiché qui nous dirigera vers la page EditUser.
  • -
  • Email - affiche l'email.
  • -
  • Administrateur - indique si le compte est celui d'un administrateur.
  • -
  • Commande - affiche une colonne de bouton "supprimer". En cliquant sur un de ces boutons, la suppression du compte sera effectuée.
  • -
- -

-Nous créons deux fichiers protected/pages/users/AdminUser.page et protected/pages/users/AdminUser.php qui contiendront respectivement le gabarit et la classe. -

- -

Création du gabarit

-

-Nous allons utiliser un contrôle TDataGrid pour afficher les données. Suivant l'analyse précédente, nous allons configurer quatre colonnes: -

- -
    -
  • THyperLinkColumn affiche le pseudo. L'URL sera construite suivant les instructions de la propriété DataNavigateUrlFormatString.
  • -
  • TBoundColumn affiche l'email.
  • -
  • TCheckBoxColumn utilise des cases à cocher pour indiquer si le compte est un compte administrateur.
  • -
  • TButtonColumn affiche un bouton "Supprimer".
  • -
- - -

Le gabarit complet est affiché ci-après:

- - - -<%@ Title="Mon Blog - Administration des comptes utilisateurs" %> - -<com:TContent ID="Main"> - -

Administration des comptes utilisateurs

- -Créer un nouvel utilisateur -
- -<com:TDataGrid ID="UserGrid" - DataKeyField="username" - AutoGenerateColumns="false" - OnDeleteCommand="deleteButtonClicked"> - - <com:THyperLinkColumn - HeaderText="Pseudo" - DataTextField="username" - DataNavigateUrlField="username"> - <prop:DataNavigateUrlFormatString># - $this->Service->constructUrl('users.EditUser',array('username'=>{0})) - </prop:DataNavigateUrlFormatString> - </com:THyperLinkColumn> - - <com:TBoundColumn - HeaderText="Email" - DataField="email" /> - - <com:TCheckBoxColumn - HeaderText="Administrateur" - DataField="role" /> - - <com:TButtonColumn - HeaderText="Commande" - Text="Supprimer" - ButtonType="PushButton" - CommandName="delete" /> - -</com:TDataGrid> - -</com:TContent> -
- - -

Création du fichier de classe

- - -

-Dans le gabarit précédent, le bouton OnDeleteCommand déclenche l'évènement deleteButtonClicked() que nous devons implémenter dans le fichier de classe. De plus, la grille de données doit être renseignée avec les informations utilisateurs lorsque la page est initialisée. Nous écrivons donc notre fichier de classe comme ci-dessous : -

- - -class AdminUser extends TPage -{ - /** - * Remplis la grille avec la liste des utilisateurs. - * Cette méthode est appelée lors de l'initialisation de la page. - * @param mixed param : paramètres de l'évènement - */ - public function onInit($param) - { - parent::onInit($param); - // lit tout les comptes utilisateurs - $this->UserGrid->DataSource=UserRecord::finder()->findAll(); - // et les associes à la grille - $this->UserGrid->dataBind(); - } - - /** - * Supprime un compte utilisateur. - * Cette méthode répond à l'évènement OnDeleteCommand. - * @param mixed sender : celui qui a généré l'évènement - * @param mixed param : paramètres de l'évènement - */ - public function deleteButtonClicked($sender,$param) - { - // récupère l'identifiant du bouton sur lequel on a cliqué - $item=$param->Item; - // récupère auprès de la grille la clé primaire correspondante à l'identifiant - $username=$this->UserGrid->DataKeys[$item->ItemIndex]; - // supprime le compte utilisateur en utilisant la clé primaire - UserRecord::finder()->deleteByPk($username); - } -} - - -

-Dans le code précédent, la méthode deleteButtonClicked() est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété Item.ItemIndex du paramètre de l'évènement. Avec cet index, nous recherchons quelle est la clé primaire de la ligne grâce à la propriété DataKeys. -Dans le code précédent, la méthode deleteButtonClicked() est appelée quand on clique sur le bouton "Supprimer". Pour savoir à quelle ligne appartenait le bouton, nous utilisons la propriété Item.ItemIndex du paramètre de l'évènement. Avec cet index, nous recherchons quelle est la clé primaire de la ligne grâce à la propriété DataKeys. -

- - -Tous les contrôles liés sont basé sur le même modèle. C'est à dire, définition de la propriété DataSource pour savoir d'où proviennent les données et appel à la méthode dataBind() pour effectivement lier les données au contrôle. - - -

Test

- -

-Pour tester notre page AdminUser, nous naviguons à l'adresse http://hostname/blog/index.php?page=users.AdminUser. Il peut vous être demandé de vous connecter en tant qu'administrateur auparavant si ce n'est déjà fait. Le résultat suivant apparaitra. -

- - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page deleted file mode 100755 index db410253..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateEditUser.page +++ /dev/null @@ -1,215 +0,0 @@ - - -

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

- - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page deleted file mode 100755 index 07e97b87..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateLoginUser.page +++ /dev/null @@ -1,161 +0,0 @@ - - -

Création de la page LoginUser

- -

-La page LoginUser affiche un formulaire et gère l'authentification de l'utilisateur. Comme décrit dans authentification et autorisation, le navigateur est automatiquement redirigé vers la page LoginUser quand un utilisateur essaye d'accéder à une page protégée, telle que la page d'administration des utilisateurs. -

- -

-Le processus de la page LoginUser est similaire à celui de la page Contact: -

-
    -
  1. Quand un utilisateur accède à la page LoginUser, un formulaire est affiché;
  2. -
  3. L'utilisateur remplit les champs, nom de l'utilisateur et mot de passe et clique sur le bouton "envoyer";
  4. -
  5. La classe LoginUser reçoit l'évènement "login" et lance la séquence d'authentification;
  6. -
  7. Si le nom d'utilisateur et le mot de passe sont corrects, le système l'enregistre en session et le redirige vers la page protégée demandée. Dans le cas contraire, un message "mot de passe invalide" est affiché. -
- -

-Nous créons les deux fichiers protected/pages/users/LoginUser.page et protected/pages/users/LoginUser.php qui enregistre le gabarit et la classe respectivement. -

- -

Création du gabarit

- -

-Ci-après est affiché le gabarit pour LoginUser. Comme vous pouvez le constater, la page contient un champ de saisie pour le nom de l'utilisateur et un autre pour le mot de passe. Le nom de l'utilisateur est requis, ce que le validateur TRequiredFieldValidator contrôle. La validité du mot de passe est assurée par le validateur TCustomValidator qui fait un appel à la méthode validateUser() de la classe. La page contient aussi un bouton "envoyer" qui fait un appel à loginButtonClicked() quand il est activé. -

- - -<%@ Title="My Blog - Login" %> - -<com:TContent ID="Main"> - -

Connexion

- -Votre nom: -<com:TRequiredFieldValidator - ControlToValidate="Username" - ErrorMessage="Veuillez indiquer votre nom." - Display="Dynamic" /> -
-<com:TTextBox ID="Username" /> - -
-Mot de passe: -<com:TCustomValidator - ControlToValidate="Password" - ErrorMessage="vous avez saisi un mot de passe invalide." - Display="Dynamic" - OnServerValidate="validateUser" /> -
-<com:TTextBox ID="Password" TextMode="Password" /> - -
-<com:TButton Text="Envoyer" OnClick="loginButtonClicked" /> - -</com:TContent> -
- -

Création de la classe

- -

-Tout comme la page Contact, la page LoginUser a aussi besoin d'un fichier de classe qui implémente les évènements générés dans le fichier gabarit. Ici, nous avons besoin de deux méthodes : validateUser() et loginButtonClicked(). Dans validateUser(), nous utilisons le gestionnaire d'authentification pour vérifier si le nom d'utilisateur et le mot de passe sont valides. Si c'est le cas, le gestionnaire d'authentification créé automatiquement une session utilisateur avec les données correspondantes. -

- - -class LoginUser extends TPage -{ - /** - * Vérifie la validité du nom d'utilisateur et du mot de passe. - * Cette méthode implémente l'évènement OnServerValidate du validateur TCustomValidator. - * @param mixed sender : celui qui a généré l'évènement - * @param mixed param : paramètres de l'évènement - */ - public function validateUser($sender,$param) - { - $authManager=$this->Application->getModule('auth'); - if(!$authManager->login($this->Username->Text,$this->Password->Text)) - $param->IsValid=false; // indique au validateur que la validation à échoué - } - - /** - * Rédirige le navigateur vers l'URL originellement demandée si la validation est Ok. - * Cette méthode implémente l'évènement OnClick du bouton "envoyer". - * @param mixed sender : celui qui a généré l'évènement - * @param mixed param : paramètres de l'évènement - */ - public function loginButtonClicked($sender,$param) - { - if($this->Page->IsValid) // toutes les validations sont ok ? - { - // récupère l'URL de la page protégée qui avait été demandée par l'utilisateur - $url=$this->Application->getModule('auth')->ReturnUrl; - if(empty($url)) // l'utilisateur à accéder à la page de connexion directement - $url=$this->Service->DefaultPageUrl; - $this->Response->redirect($url); - } - } -} - - - -

Test

- -

-Nous avons donc créé la page LoginUser. Nous pouvons la tester en naviguant à l'URL http://hostname/blog/index.php?page=users.LoginUser. Rappellez-vous que la dans la section Création de la base, nous avons déjà créé deux comptes utilisateurs (nom d'utilisateur/mot de passe) admin/demo et demo/demo. Nous pouvons donc les utiliser pour tester notre page de connexion. -

- - - -

Ajout des liens de connexion/déconnexion à notre gabarit principal

-

-Pour permettre à l'utilisateur d'accéder directement aux pages de connexion/déconnexion, nous modifions le gabarit principal MainLayout. En particulier, nous ajoutons un lien vers la page LoginUser. Nous ajoutons aussi un lien "se déconnecter" qui permet à l'utilisateur de se déconnecter. -

- -

-Nous modifions le pied de page de notre gabarit principal MainLayout. La visibilité des liens vers "se connecter" et "se déconnecter" dépend du statut de l'utilisateur. Si l'utilisateur n'est pas encore connecté, ie: $this->User->IsGuest est vrai, alors le lien "se connecter" est visible tandis que le lien "se déconnecter" ne l'est pas et inversement s'il est connecté. -

- - - - - -

-Vu que le lien "se déconnecter" génère l'évènement OnClick avec comme nom d'évènement logoutButtonClicked(), nous devons modifier le fichier de classe de MainLayout comme ci-dessous : -

- - -class MainLayout extends TTemplateControl -{ - /** - * Déconnecte un utilisateur. - * Cette méthode répond à l'évènement OnClick du lien "se déconnecter". - * @param mixed sender : celui qui a généré l'évènement - * @param mixed param : paramètres de l'évènement - */ - public function logoutButtonClicked($sender,$param) - { - $this->Application->getModule('auth')->logout(); - $url=$this->Service->constructUrl($this->Service->DefaultPage); - $this->Response->redirect($url); - } -} - - -

-Maintenant si nous visitons n'importe quelle page de notre blog, nous verrons apparaitre un lien en pied de page. Le lien affiche "se connecter" si nous ne sommes pas connectés et "se déconnecter" dans le cas contraire. Si nous cliquons sur le lien "se déconnecter", nous sommes redirigés vers la page d'accueil et le lien "se connecter" apparait indiquant que nous ne sommes plus connectés. -

- -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page deleted file mode 100755 index e886e4ea..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/CreateNewUser.page +++ /dev/null @@ -1,212 +0,0 @@ - - -

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. - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page b/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page deleted file mode 100755 index 306434e1..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/fr/Overview.page +++ /dev/null @@ -1,42 +0,0 @@ - - -

Vue d'ensemble de la gestion des utilisateurs

- - -

-Dans cette section, nous allons créer les pages concernant la gestion des utilisateurs. En particulier, nous allons implémenter les fonctionnalités suivantes: connexion/déconnexion des utilisateurs, création d'un utilisateur, mise à jour/suppression des utilisateurs. -

- - -

-En accord avec les buts à atteindre, nous devons créer les pages suivantes. Pour une meilleure organisation de notre code, ces pages seront créées dans le dossier protected/pages/users. -

- - -
    -
  • LoginUser affiche le formulaire de connexion.
  • -
  • NewUser pour la création d'un compte utilisateur.
  • -
  • EditUser permet à un utilisateur enregistré de mettre à jour son profil.
  • -
  • AdminUser permet à l'administrateur de gérer les comptes utilisateurs, y compris la gestion des droits d'accès et la suppression d'un compte.
  • -
- - -

-Après avoir fini cette section, nous devrions obtenir l'arborescence suivante : -

- - - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif deleted file mode 100755 index f59fda58..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/fr/directories.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output.gif deleted file mode 100755 index 0d812dd0..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/fr/output.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif deleted file mode 100755 index 749255d6..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/fr/output2.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif b/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif deleted file mode 100755 index a11ee653..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/fr/output3.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/id/Auth.page b/demos/blog-tutorial/protected/pages/Day3/id/Auth.page deleted file mode 100755 index c4728cdf..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/Auth.page +++ /dev/null @@ -1,102 +0,0 @@ - - -

Otentikasi dan Otorisasi

- -

-Sebelum kita siap mengimplementasikan halaman pengguna, kita perlu melakukan beberapa pekerjaan guna menghidupkan otentikasi dan otorisasi. -

- -

-Kita menambah dua modul ke konfigurasi aplikasi seperti berikut: -

- - - - ...TDataSourceConfig and TActiveRecordConfig modules... - - - - - - - -

-Modul TAuthManager mengatur seluruh alur kerja otentikasi dan otorisasi. Ia menggunakan modul users sebagai manajer penggunanya (lihat di bawah). Dengan menetapkan properti LoginPage, kita menginformasikan manajer otentikasi untuk mengalihkan browser pengguna ke halaman LoginUser saat otorisasi gagal. Kami akan menjelaskan bagaimana untuk membuat LoginUser dalam subbagian berikutnya. -

- -

-Modul user adalah kelas TDbUserManager yang bertanggung jawab untuk memverifikasi keabsahan pengguna dan memelihara data dasar dalam sesi PHP. Properti UserClass diinisialisasi sebagai Application.BlogUser, yang menunjukan bahwa manajer pengguna akan melihar kelas BlogUser di bawah direktori protected (ingat alias Application merujuk ke direktori protected) dan menggunakannya untuk memelihara data sesi pengguna. -

- -

-Seperti yang akan kita lihat dalam bagian nanti, dalam kontrol dan halaman, kita dapat menggunakan $this->User untuk memperoleh obyek BlogUser yang berisi informasi pengguna yang saat ini mengakses siistem. -

- -

-Di bawah ini adalah rincian implementasi dari BlogUser. Perhatikan, Rekaman Aktif digunakan untuk melakukan query DB. Sebagai contoh, kita menggunakan UserRecord::finder()->findByPk($username) untuk mencari kunci primer yang ditetapkan oleh $username dalam tabel users. -

- - -// Sertakan file TDbUserManager.php yang mendefinisikan TDbUser -Prado::using('System.Security.TDbUserManager'); - -/** - * BlogUser Class. - * BlogUser mewakili data pengguna yang perlu dijaga dalam sesi. - * Implementasi standar memelihara informasi aturan dan pengguna. - */ -class BlogUser extends TDbUser -{ - /** - * Membuat obyek BlogUser berdasarkan username yang ditetapkan. - * Metode ini diperlukan oleh TDbUser. Ia memeriksa database - * untuk melihat apakah username yang ditetapkan ada di sana. Jika ada, - * obyek BlogUser dibuat dan diinisialisasi. - * @param string username yang ditetapkan - * @return BlogUser obyek pengguna, null jika username tidak benar. - */ - public function createUser($username) - { - // gunakan Rekaman Aktif UserRecord untuk mencari username yang ditetapkan - $userRecord=UserRecord::finder()->findByPk($username); - if($userRecord instanceof UserRecord) // jika ditemukan - { - $user=new BlogUser($this->Manager); - $user->Name=$username; // setel nama pengguna - $user->Roles=($userRecord->role==1?'admin':'user'); // setel aturan - $user->IsGuest=false; // pengguna bukan seorang tamu - return $user; - } - else - return null; - } - - /** - * Memeriksa apakah (username, password) yang ditetapkan sudah benar. - * Metode ini diperlukan oleh TDbUser. - * @param string username - * @param string password - * @return boolean apakah username dan password sudah benar. - */ - public function validateUser($username,$password) - { - // pakai Rekaman Aktif UserRecord untuk mencari pasangan (username, password). - return UserRecord::finder()->findBy_username_AND_password($username,$password)!==null; - } - - /** - * @return boolean apakah pengguna ini adalah seorang administrator. - */ - public function getIsAdmin() - { - return $this->isInRole('admin'); - } -} - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page deleted file mode 100755 index f805d477..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateAdminUser.page +++ /dev/null @@ -1,137 +0,0 @@ - - -

Membuat Halaman AdminUser

- -

-Halaman AdminUser menampilkan semua akun pengguna dalam sebuah daftar agar administrator dapat melakukan beberapa pekerjaan administratif. Demi kemudahan, pekerjaan administratif sistem blog kita mendukung termasuk mengedit dan menghapus akun pengguna. -

- -

-Kita akan menampilkan daftar pengguna dalam sebuah tabel. Setiap baris tabel mewakili satu akun pengguna, dan kolom berikut ditampilkan: -

-
    -
  • Username - menampilkan nama pengguna. Dalam setiap sel sebuah hiperlink ditampilkan membawa ke halaman EditUser terkait.
  • -
  • Email - menampilkan email.
  • -
  • Administrator - menampilkan apakah akun pengguna adalah aturan administrator.
  • -
  • Command - menampilkan kolom dengan tombol "Delete". Mengklik pada setiap tombol akan mengakibatkan penghapusan akun pengguna terkait.
  • -
- -

-Kita membuat dua file protected/pages/users/AdminUser.page dan protected/pages/users/AdminUser.php masing-masing untuk menyimpan template halaman dan kelas halaman. -

- -

Membuat Template Halaman

-

-Kita menggunakan TDataGrid untuk menampilkan akun pengguna. Berdasarkan pada analisis di atas, kita mengkonfigurasi empat kolom berikut: -

-
    -
  • THyperLinkColumn menampilkan kolom nama pengguna. URL dibentuk berdasarkan pada ekstensi PHP yang ditetapkan dalam properti DataNavigateUrlFormatString.
  • -
  • TBoundColumn menampilkan kolom email.
  • -
  • TCheckBoxColumn menggunakan kotak centang untuk menunjukan apakah akun pengguna adalah aturan administrator.
  • -
  • TButtonColumn menampilkan kolom dengan tombol "Delete".
  • -
- -

Template halaman lengkap ditampilkan seperti berikut:

- - -<%@ Title="My Blog - Manage User Accounts" %> - -<com:TContent ID="Main"> - -

Manage User Accounts

- -Create New User -
- -<com:TDataGrid ID="UserGrid" - DataKeyField="username" - AutoGenerateColumns="false" - OnDeleteCommand="deleteButtonClicked"> - - <com:THyperLinkColumn - HeaderText="Username" - DataTextField="username" - DataNavigateUrlField="username"> - <prop:DataNavigateUrlFormatString># - $this->Service->constructUrl('users.EditUser',array('username'=>{0})) - </prop:DataNavigateUrlFormatString> - </com:THyperLinkColumn> - - <com:TBoundColumn - HeaderText="Email" - DataField="email" /> - - <com:TCheckBoxColumn - HeaderText="Administrator" - DataField="role" /> - - <com:TButtonColumn - HeaderText="Command" - Text="Delete" - ButtonType="PushButton" - CommandName="delete" /> - -</com:TDataGrid> - -</com:TContent> -
- - -

Membuat Kelas Halaman

- -

-Dalam template halaman di atas, event OnDeleteCommand datagrid dengan metode deleteButtonClicked() akan kita implementasikan dalam kelas halaman. Sebagai tambahan, datagrid perlu dipopulasi dengan data akun pengguna saat halaman diinisialisasi. Oleh karena itu, kita menulis kelas halaman seperti berikut: -

- - -class AdminUser extends TPage -{ - /** - * Mempopulai datagrid dengan daftar pengguna. - * Metode ini dipanggil oleh kerangka kerja saat inisialisasi halaman - * @param mixed event parameter - */ - public function onInit($param) - { - parent::onInit($param); - // ambil semua informasi data akun - $this->UserGrid->DataSource=UserRecord::finder()->findAll(); - // mengikat data ke komponen antarmua - $this->UserGrid->dataBind(); - } - - /** - * Menghapus rekaman pengguna yang ditetapkan. - * Metode ini merespon ke event OnDeleteCommand pada datagrid. - * @param TDataGrid pengirim event - * @param TDataGridCommandEventParameter parameter event - */ - public function deleteButtonClicked($sender,$param) - { - // dapatkan item datagrid yang berisi tombol hapus yang diklik - $item=$param->Item; - // dapatkan kunci primer terkait ke item datagrid - $username=$this->UserGrid->DataKeys[$item->ItemIndex]; - // menghapus rekaman pengguna dengan kunci primer nama pengguna - UserRecord::finder()->deleteByPk($username); - } -} - - -

-Dalam kode di atas, metode deleteButtonClicked() dipanggil kapan saja tombol "Delete" diklik. untuk menentukan baris mana pada tombol yang diklik, kita memeriksa properti Item.ItemIndex pada parameter event. Untuk selanjutnya mengidentifikasi akun pengguna mana yang akan dihapus, kita mengambil nilai kunci primer (username) melalui properti DataKeys pada DataGrid. -

- - -Semua kontrol data-bound mempunyai pola penggunaan yang sama. Yaitu, Setel properti DataSource dengan data dan panggil metode dataBind() untuk mengikat data ke struktur internal kontrol. - - - -

Pengujian

-

-Untuk menguji halaman AdminUser, kunjungi URL http://hostname/blog/index.php?page=users.AdminUser. Anda mungkin perlu masuk sebagai administrator lebih dahulu jika Anda belum melakukannya. Kita akan melihat hasil seperti berikut. -

- - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page deleted file mode 100755 index 2f03ecec..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateEditUser.page +++ /dev/null @@ -1,212 +0,0 @@ - - -

Membuat Halaman EditUser

- -

-Halaman EditUser sangat mirip dengan NewUser. Perbedaan utamanya adalah bahwa saat EditUser awalnya diminta, field input harus diinisialisasi dengan informasi pengguna yang sudah ada. Sedikit perbedaan lainnya adalah bahwa EditUser juga bisa diakses oleh pengguna normal. -

- -

-Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut: -

-
    -
  • Jika pengguna saat ini adalah administrator, dia dapat mengedit setiap akun pengguna dengan menetapkan akun nama pengguna dalam variabel GET bernama 'username'. Sebagai contoh, http://hostname/blog/index.php?page=users.EditUser&username=demo.
  • -
  • Jika pengguna saat ini adalah administrator dan URL tidak berisi 'username', data administrator sendiri sedang dimutakhirkan.
  • -
  • Jika pengguna saat ini adalah pengguna normal, dia hanya bisa mengedit informasi akunnya sendiri, dan dia tidak bisa memodifikasi data aturannya.
  • -
- -

-Kita membuat dua file protected/pages/users/EditUser.page dan protected/pages/users/EditUser.php masing-masing untuk menyimpan template halaman dan kelas halaman. -

- -

Membuat Template Halaman

-

-Seperti yang telah Anda tebak, template halaman EditUser sebagian besar sama seperti pada NewUser. Selain perbedaan dalam judul halaman dan judul tombol submit, ada tiga perbedaan utama. -

-
    -
  • Kotak teks "username" diganti oleh kontrol TLabel karena kita tidak membolehkan memodifikasi nama pengguna;
  • -
  • Validator untuk input "password" dihilangkan. Ini dikarenakan jika pengguna tidak melengkapi kata sandi selama mengedit, itu berarti pengguna tidak ingin mengubah kata sandi.
  • -
  • Input "role" dikelilingi oleh TControl yang penampakannya dihidup matikan berdasarkan aturan pengguna yang masuk saat ini. Jika pengguna bukan administrator, input "role" tidak akan ditampilkan karena pengguna normal tidak diperbolehkan untuk memodifikasi aturannya.
  • -
-

- - -<%@ Title="My Blog - Edit User" %> - -<com:TContent ID="Main"> - -

Edit User

- -Username: -<com:TLabel ID="Username" /> - -
-Password: -
-<com:TTextBox ID="Password" TextMode="Password" /> - -
-Re-type Password: -<com:TCompareValidator - ControlToValidate="Password" - ControlToCompare="Password2" - ErrorMessage="Your password entries did not match." - Display="Dynamic" /> -
-<com:TTextBox ID="Password2" TextMode="Password" /> - -
-Email Address: -<com:TRequiredFieldValidator - ControlToValidate="Email" - ErrorMessage="Please provide your email address." - Display="Dynamic" /> -<com:TEmailAddressValidator - ControlToValidate="Email" - ErrorMessage="You entered an invalid email address." - Display="Dynamic" /> -
-<com:TTextBox ID="Email" /> - -<com:TControl Visible="<%= $this->User->IsAdmin %>"> -
-Role: -
-<com:TDropDownList ID="Role"> - <com:TListItem Text="Normal User" Value="0" /> - <com:TListItem Text="Administrator" Value="1" /> -</com:TDropDownList> -</com:TControl> - -
-First Name: -
-<com:TTextBox ID="FirstName" /> - -
-Last Name: -
-<com:TTextBox ID="LastName" /> - -
-<com:TButton Text="Save" OnClick="saveButtonClicked" /> - -</com:TContent> -
- - -

Membuat Kelas Halaman

- -

-Berdasarkan pada deskripsi di atas dan template, kita perlu menulis kelas halaman yang mengawali input dengan informasi pengguna yang sudah ada. Sebagai tambahan, kelas halaman juga perlu untuk mengimplementasikan metode saveButtonClicked() yang disertakan pada event tombol "save" OnClick. -

- - -class EditUser extends TPage -{ - /** - * Menginisialisasi input dengan data pengguna yang sudah ada. - * Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi. - * @param mixed event parameter - */ - public function onInit($param) - { - parent::onInit($param); - if(!$this->IsPostBack) // jika halaman awalnya diminta - { - // Ambil data pengguna yang sudah ada. Ini sama dengan: - // $userRecord=$this->getUserRecord(); - $userRecord=$this->UserRecord; - - // Populasikan kontrol input dengan data pengguna yang sudah ada - $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; - } - } - - /** - * Menyimpan akun pengguna jika semua input sudah benar. - * Metode ini merespon event OnClick pada tombol "save". - * @param mixed event sender - * @param mixed event parameter - */ - public function saveButtonClicked($sender,$param) - { - if($this->IsValid) // saat semua validasi sukses - { - // Ambil data pengguna yang sudah ada. Ini sama dengan: - $userRecord=$this->UserRecord; - - // Ambil data input - $userRecord->username=$this->Username->Text; - // mutakhirkan kata sandi saat input tidak kosong - if(!empty($this->Password->Text)) - $userRecord->password=$this->Password->Text; - $userRecord->email=$this->Email->Text; - // mutakhirkan aturan jika pengguna saat ini adalah administrator - if($this->User->IsAdmin) - $userRecord->role=(int)$this->Role->SelectedValue; - $userRecord->first_name=$this->FirstName->Text; - $userRecord->last_name=$this->LastName->Text; - - // simpan ke database melalui mekanisme Rekaman Aktif - $userRecord->save(); - - // alihkan browser ke homepage - $this->Response->redirect($this->Service->DefaultPageUrl); - } - } - - /** - * Mengembalikan data pengguna yang diedit. - * @return UserRecord data pengguna yang diedit. - * @throws THttpException jika data pengguna tidak ditemukan. - */ - protected function getUserRecord() - { - // pengguna yang diedit adalah pengguna yang saat ini sudah masuk - $username=$this->User->Name; - // jika var GET 'username' tidak kosong dan pengguna saat ini adalah - // administrator, lebih baik kita menggunakan nilai var GET. - if($this->User->IsAdmin && $this->Request['username']!==null) - $username=$this->Request['username']; - - // gunakan Rekaman Aktif untuk melihat nama pengguna yang ditetapkan - $userRecord=UserRecord::finder()->findByPk($username); - if(!($userRecord instanceof UserRecord)) - throw new THttpException(500,'Username is invalid.'); - return $userRecord; - } -} - - - -Metode onInit() dipanggil oleh PRADO selama salah satu masa hidup halaman. Metode masa hidup umum lainnya ditimpa termasuk onPreInit(), onLoad() dan onPreRender(). - - -

Menambah Pemeriksaan Perijinan

-

-Agar halaman EditUser juga bisa diakses oleh para pengguna (users="@"), kita juga perlu menyesuaikan file konfigurasi halaman protected/pages/users/config.xml. -

- - - - - - - - - - - - - -

Pengujian

-

-Untuk menguji halaman EditUser, kunjungi URL http://hostname/blog/index.php?page=users.EditUser&username=demo. Anda mungkin perlu masuk lebih dulu jika Anda belum melakukannya. Coba masuk dengan akun berbeda (e.g. admin/demo, demo/demo) dan lihat bagaimana halaman ditampilkan secara berbeda. -

- -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page deleted file mode 100755 index 1debbec0..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateLoginUser.page +++ /dev/null @@ -1,162 +0,0 @@ - - -

Membuat Halaman LoginUser

- -

-Halaman LoginUser menampilkan formulir masuk dan mengotentikasi pengguna yang mencoba untuk masuk. Seperti dijelaskan dalam otentikasi dan otorisasi, browser pengguna secara otomatis dialihkan ke halaman LoginUser ketika pengguna mencoba untuk mengakses halaman istimewa, seperti misalhnya halaman admin pengguna. -

- -

-Alur kerja LoginUser sangat mirip dengan halaman Contact: -

-
    -
  1. Ketika pengguna mengakses halaman LoginUser, formulir masuk ditampilkan;
  2. -
  3. Pengguna mengisi nama pengguna dan kata sandi serta mengklik pada tombol "login";
  4. -
  5. LoginUser menerima event "login" dan memicu rangkaian otentikasi;
  6. -
  7. Jika pengguna memasukan nama pengguna dan kata sandi yang benar, sistem menempatkan identitas yang sah dan mengalihkan browser-nya ke halaman istimewa yang diinginkan; Jika tidak, pesan "password invalid" akan ditampilkan. -
- -

-Kita membuat dua file protected/pages/users/LoginUser.page dan protected/pages/users/LoginUser.php masing-masing untuk menyimpan template halaman dan kelas halaman. -

- -

Membuat Template Halaman

- -

-Di bawah ini kita menampilkan template untuk LoginUser. Seperti kita lihat, halaman sebagian besar berisi kotak teks untuk mengumpulkan nama pengguna dan kotak teks untuk kata sandi. Input nama pengguna diperlukan, yang dipastikan oleh TRequiredFieldValidator. Kebenaran dari input kata sandi dipastikan oleh TCustomValidator yang memanggil metode validateUser() halaman ketika validasi dilakukan. Halaman juga mempunyai tombol "login" yang memanggil loginButtonClicked() halaman ketika itu diklik. -

- - -<%@ Title="My Blog - Login" %> - -<com:TContent ID="Main"> - -

Login

- -Username: -<com:TRequiredFieldValidator - ControlToValidate="Username" - ErrorMessage="Please provide your username." - Display="Dynamic" /> -
-<com:TTextBox ID="Username" /> - -
-Password: -<com:TCustomValidator - ControlToValidate="Password" - ErrorMessage="Your entered an invalid password." - Display="Dynamic" - OnServerValidate="validateUser" /> -
-<com:TTextBox ID="Password" TextMode="Password" /> - -
-<com:TButton Text="Login" OnClick="loginButtonClicked" /> - -</com:TContent> -
- -

Membuat Kelas Halaman

- -

-Seperti halaman Contact, halaman LoginUser juga memerlukan file kelas yang sebagian besar berisi implementasi pengendali event yang disertakan dalam template halaman. Di sini, kita perlu mengimplementasikan dua metode: validateUser() dan loginButtonClicked(). Dalam validateUser(), kita menggunakan manajer otentikasi untuk memverifikasi apakan nama pengguna serta kata sandinya sudah benar. Jika benar, manajer otentikasi akan secara otomatis membuat sesi pengguna dengan informasi identitas pengguna terkait. -

- - -class LoginUser extends TPage -{ - /** - * Validates whether the username and password are correct. - * This method responds to the TCustomValidator's OnServerValidate event. - * @param mixed event sender - * @param mixed event parameter - */ - public function validateUser($sender,$param) - { - $authManager=$this->Application->getModule('auth'); - if(!$authManager->login($this->Username->Text,$this->Password->Text)) - $param->IsValid=false; // beritahu validator bawa validasi gagal - } - - /** - * Redirects the user's browser to appropriate URL if login succeeds. - * This method responds to the login button's OnClick event. - * @param mixed event sender - * @param mixed event parameter - */ - public function loginButtonClicked($sender,$param) - { - if($this->Page->IsValid) // semua validasi sukses - { - // Dapatkan URL pada halaman istimewa yang diinginkan pengguna yang akan dikunjungi - $url=$this->Application->getModule('auth')->ReturnUrl; - if(empty($url)) // pengguna mengakses halaman masuk secara langsung - $url=$this->Service->DefaultPageUrl; - $this->Response->redirect($url); - } - } -} - - - -

Pengujian

- -

-Kita telah membuat halaman LoginUser. Kita dapat mengujinya dengan mengunjungi URL http://hostname/blog/index.php?page=users.LoginUser. Ingat dalam subbagian Membuat Database, kita sudah membuat dua akun pengguna (username/password): admin/demo dan demo/demo. Kita dapat menggunakannya untuk menguji halaman masuk kita. -

- - - -

Menambahkan Link Login/Logout ke Master

- -

-Guna melengkapi cara langsung bagi pengguna untuk masuk dan keluar, kita memodifikasi sedikit kontrol master MainLayout. Dalam keadaan tertentu, kita menambahkan hiperlink "login" yang mengaitkan halaman LoginUser. Kita juga menambahkan tombol link "logout" yang mengeluarkan pengguna saat ia diklik. -

- -

-Kita memodifikasi bagian footer dari template MainLayout sebagai berikut. Penampakan "login" dan "logout" ditentukan berdasarkan status pengguna. Jika pengguna belum masuk, misalnya $this->User->IsGuest adalah true, link "login" terlihat sementara link "logout" tidak; dan begitu sebaliknya. -

- - - - - -

-Karena tombol "logout" menempelkan event OnClick dengan metode yang dipanggil logoutButtonClicked(), kita juga perlu mengubah file kelas MainLayout. -

- - -class MainLayout extends TTemplateControl -{ - /** - * Logs out a user. - * This method responds to the "logout" button's OnClick event. - * @param mixed event sender - * @param mixed event parameter - */ - public function logoutButtonClicked($sender,$param) - { - $this->Application->getModule('auth')->logout(); - $url=$this->Service->constructUrl($this->Service->DefaultPage); - $this->Response->redirect($url); - } -} - - -

-Sekarang jika kita mengunjungi setiap halaman pada sistem blog kita, kita akah melihat apakah ada link di bawah halaman. Link menampilkan "Login" jika kita belum masuk dan "Logout" jika telah masuk. Jika kita mengklik pada "Logout", browser akan mengalihkannya ke homepage dan "Login" ditampilkan yang berarti kita sudah dikeluarkan. -

- -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page b/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page deleted file mode 100755 index d90df01f..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/CreateNewUser.page +++ /dev/null @@ -1,210 +0,0 @@ - - -

Membuat Halaman NewUser

- -

-Halaman NewUser disediakan untuk pengguna administrator guna membuat akun pengguna baru. Ini perlu menampilkan sebuah formulir yang mengumpulkan informasi mengenai akun pengguna baru. Berdasarkan definisi database, kita akan perlu mengumpulkan informasi berikut: -

- -
    -
  • username - string, diperlukan dan unik
  • -
  • email - string, diperlukan dan unik
  • -
  • password - string, diperlukan
  • -
  • role - integer, diperlukan (baik 0 ataupun 1)
  • -
  • first_name - string, opsional
  • -
  • last_name - string, opsional
  • -
- -

-Kita membuat dua file protected/pages/users/NewUser.page dan protected/pages/users/NewUser.php masing-masing untuk menyimpan template halaman dan kelas halaman. -

- -

Membuat Template Halaman

-

-Berdasarkan pada analisis di atas, kita menulis template halaman seperti berikut: -

- - -<%@ Title="My Blog - New User" %> - -<com:TContent ID="Main"> - -

Create New User

- -Username: -<com:TRequiredFieldValidator - ControlToValidate="Username" - ErrorMessage="Please provide a username." - Display="Dynamic" /> -<com:TCustomValidator - ControlToValidate="Username" - ErrorMessage="Sorry, your username is taken by someone else. Please choose another username." - OnServerValidate="checkUsername" - Display="Dynamic" /> -
-<com:TTextBox ID="Username" /> - -
-Password: -<com:TRequiredFieldValidator - ControlToValidate="Password" - ErrorMessage="Please provide a password." - Display="Dynamic" /> -
-<com:TTextBox ID="Password" TextMode="Password" /> - -
-Re-type Password: -<com:TCompareValidator - ControlToValidate="Password" - ControlToCompare="Password2" - ErrorMessage="Your password entries did not match." - Display="Dynamic" /> -
-<com:TTextBox ID="Password2" TextMode="Password" /> - -
-Email Address: -<com:TRequiredFieldValidator - ControlToValidate="Email" - ErrorMessage="Please provide your email address." - Display="Dynamic" /> -<com:TEmailAddressValidator - ControlToValidate="Email" - ErrorMessage="You entered an invalid email address." - Display="Dynamic" /> -
-<com:TTextBox ID="Email" /> - -
-Role: -
-<com:TDropDownList ID="Role"> - <com:TListItem Text="Normal User" Value="0" /> - <com:TListItem Text="Administrator" Value="1" /> -</com:TDropDownList> - -
-First Name: -
-<com:TTextBox ID="FirstName" /> - -
-Last Name: -
-<com:TTextBox ID="LastName" /> - -
-<com:TButton Text="Create" OnClick="createButtonClicked" /> - -</com:TContent> -
- -

-Template tidak jauh berbeda dari template Contact dan halaman LoginUser. Sebagian besar terdiri dari kotak teks dan validator. Beberapa kotak teks, seperti nama pengguna, dikaitkan dengan dua validator karena keterlibatan aturan multipel validasi. -

- - -

Membuat Kelas Halaman

- -

-Dari template halaman di atas, kita melihat bahwa kita perlu untuk menulis sebuah kelas halaman yang mengimplementasikan dua pengendali event: checkUsername() (disertakan ke event validator kustom OnServerValidate) dan createButtonClicked() (disertakan ke event tombol "create" OnClick). Oleh karena itu, kita menulis kelas halaman seperti berikut: -

- - -class NewUser extends TPage -{ - /** - * Memeriksa apakah nama pengguna sudah ada dalam database. - * Metode ini merespon ke event OnServerValidate pada validator kustom nama pengguna. - * @param mixed event sender - * @param mixed event parameter - */ - public function checkUsername($sender,$param) - { - // benar jika nama pengguna tidak ditemukan dalam database - $param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null; - } - - /** - * Membuat akun pengguna baru jika semua input benar. - * Metode ini merespon ke event OnClick pada tombol "create". - * @param mixed event sender - * @param mixed event parameter - */ - public function createButtonClicked($sender,$param) - { - if($this->IsValid) // ketika semua validasi sukses - { - // populasikan obyek UserRecord dengan input pengguna - $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; - - // simpan database melalui mekanisme Rekaman Aktif - $userRecord->save(); - - // alihkan browser ke homepage - $this->Response->redirect($this->Service->DefaultPageUrl); - } - } -} - - -

-Dalam kode di atas, memanggil save() akan menyisipkan baris baru dalam tabel users. Fitur intuitif ini dihidupkan oleh Rekaman Aktif. -

- - -Untuk memudahkan, nama pengguna dalam sistem blg kita adalah tidak sensitif-huruf! Dalam banyak sistem praktis, nama pengguna mungkin perlu sensitif-huruf. Maka penanganan khusus perlu dibuat saat pembuatan akun pengguna baru dan juga melakukan otentikasi. Juga, ruang kosong dalam nama pengguna perlu dipotong ketika membuat akun baru dengan itu. - - - -

Pengujian

-

-Untuk menguji halaman NewUser, kunjungi URL http://hostname/blog/index.php?page=users.NewUser. Kita akan melihat output halaman berikut. Coba masukan informasi berbeda ke dalam formulir dan lihat bagaimana input divalidasi. Jika semua aturan validasi memuaskan, kita akan mengharapkan akun pengguna dibuat dan browser dialihkan ke homepage. -

- - - - -

Menambahkan Pemeriksaan Perijinan

-

-Selama pengujian, Anda mungkin bertanya: apakah halaman NewUser seharusnya hanya bisa diakses oleh pengguna administrator? Ya, ini disebut otorisasi. Sekarang kami menjelaskan bagaimana kita menambahkan pemeriksaan perijinan ini ke halaman NewUser. -

- -

-Cara langsung pada pemeriksaan perijinan adalah dalam kelas halaman di mana kita memeriksa apakah $this->User->IsAdmin adalah true, dan jika tidak, kita mengalihkan browser ke halaman LoginUser. -

- -

-PRADO menawarkan cara lebih sistematis terhadap pemeriksaan perijinan akses halaman. Untuk melakukannyaTo , kita perlu menggunakan konfigurasi halaman. Membuat sebuah file protected/pages/users/config.xml dengan konten seperti berikut: -

- - - - - - - - - - - -

-Konfigurasi halaman berisi aturan otorisasi yang berlaku untuk halaman di bawah direktori protected/pages/users. Konfigurasi di atas terbaca bahwa para pengguna dalam role admin dapat mengakses semua halaman (lihat BlogUser.createUser() untuk mengapa harus kata "admin"). Untuk saat ini semua para pengguna lain (users="*") ditolak untuk mengakses halaman dalam direktori ini - kecuali untuk halaman LoginUser yang seharusnya selalu bisa diakses. -

- -

-Sekarang jika kita mengunjungi halaman NewUser sebagai seorang tamu, kita akan dialihkan ke halaman LoginUser terlebih dahulu. Jika kita masuk dengan sukses, kita akan mengalihkan kembali ke halamanNewUser. -

- - -Konfigurasi halaman dapat berisi lebih dari satu aturan otorisasi. Sebagai contoh, ia dapat menyertakan modul seperti yang ktia lakukan dalam konfigurasi aplikasi. Untuk aplikasi PRADO, setiap direktori halaman dapat mempunyai konfigurasi halaman yang berlaku bagi halaman dalam direktori yang sama dan seluruh subdirektorinya. - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/Overview.page b/demos/blog-tutorial/protected/pages/Day3/id/Overview.page deleted file mode 100755 index 62c29438..00000000 --- a/demos/blog-tutorial/protected/pages/Day3/id/Overview.page +++ /dev/null @@ -1,26 +0,0 @@ - - -

Tinjauan Manajemen Pengguna

- -

-Dalam bagian ini, kita membuat halaman yang terkait dengan manajemen pengguna. Dalam keadaan tertentu, kita mengimplementasikan fitur yang dibutuhkan ini: pengguna masuk/keluar, membuat akun pengguna baru dan memutakhirkan/menghapus akun pengguna. -

- -

-Berdasarkan kebutuhan, kita perlu membuat halaman berikut. Guna mengatur lebih baik kode kita, halaman terkait-pengguna ini akan dibuat di bawah direktori baru protected/pages/users. -

- -
    -
  • LoginUser menampilkan formulir login untuk memasukan pengguna.
  • -
  • NewUser membuat akun pengguna baru.
  • -
  • EditUser membolehkan pengguna teregistrasi memutakhirkan profilnya.
  • -
  • AdminUser membolehkan administrator untuk mengatur akun pengguna, termasuk setelan tingkat perijinan dan menghapus akun pengguna.
  • -
- -

-Setelah menyelesaikan bagian ini, kita mengharapkan bisa melihat direktori dan file berikut: -

- - - -
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day3/id/directories.gif b/demos/blog-tutorial/protected/pages/Day3/id/directories.gif deleted file mode 100755 index f59fda58..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/id/directories.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output.gif b/demos/blog-tutorial/protected/pages/Day3/id/output.gif deleted file mode 100755 index 0d812dd0..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/id/output.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output2.gif b/demos/blog-tutorial/protected/pages/Day3/id/output2.gif deleted file mode 100755 index 749255d6..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/id/output2.gif and /dev/null differ diff --git a/demos/blog-tutorial/protected/pages/Day3/id/output3.gif b/demos/blog-tutorial/protected/pages/Day3/id/output3.gif deleted file mode 100755 index a11ee653..00000000 Binary files a/demos/blog-tutorial/protected/pages/Day3/id/output3.gif and /dev/null differ -- cgit v1.2.3