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:

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:

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.