Création de la page détail d'un message ReadPost

La page ReadPost affiche le détail d'un message. Pour les utilisateurs autorisés, un lien sera disponible permettant de modifier ou de supprimer le message.

Nous créons deux fichiers protected/pages/posts/ReadPost.page et protected/pages/posts/ReadPost.php qui contiendront respectivement notre gabarit et notre classe.

Création du gabarit

Le gabarit de ReadPost est très proche du gabarit de PostRenderer, chacun d'eux affiche le détail d'un message. La différence est que la page ReadPost doit afficher deux boutons, permettant aux utilisateurs autorisés de modifier ou supprimer le message.

<com:TContent ID="Main">

<com:TLiteral Text="<%= $this->Post->title %>" />

<com:TControl Visible="<%= $this->canEdit() %>"> Modifier | <com:TLinkButton Text="Supprimer" OnClick="deletePost" Attributes.onclick="javascript:if(!confirm('Etes vous sûr ?')) return false;" /> </com:TControl>

Auteur: <com:TLiteral Text="<%= $this->Post->author->username %>" />
Heure: <com:TLiteral Text="<%= date('m/d/Y h:m:sa', $this->Post->create_time) %>" />

<com:TLiteral Text="<%= $this->Post->content %>" />

</com:TContent>

Plusieurs expressions PHP sont utilisées dans le gabarit. L'expression $this->Post fait référence à la propriété définie dans la classe de ReadPost. Elle représente l'objet PostRecord correspondant au message actuel.

Même si nous utilisons régulièrement des expressions dans nos gabarits, nous n'en abusons pas. Une des règles principales pour savoir si l'on doit utiliser une expression est l'expression doit être une propriété ou une simple mise en forme d'une propriété. En suivant cette ligne de conduite, nous nous assurons d'une bonne séparation entre le contenu et la présentation, sans perdre en flexibilité.

Nous pouvons aussi remarquer dans le gabarit précédent, que, nos deux boutons sont entourés d'un TControl dont la propriété 'visible' est déterminée par l'expression $this->canEdit(). Pour le bouton Supprimer, nous utilisons une boite de dialogue javascript pour confirmer la suppression du message. Nous pouvons aussi remarquer dans le gabarit précédent, que, nos deux boutons sont entourés d'un TControl dont la propriété 'visible' est déterminée par l'expression $this->canEdit(). Pour le bouton Supprimer, nous utilisons une boite de dialogue javascript pour confirmer la suppression du message.

Tous les contrôles PRADO, ont une propriété très utile Attributes qui accepte n'importe quelle paire de valeurs (nom-valeur). La plupart des contrôles PRADO répercutent directement ces informations dans la balise HTML. Par exemple, dans le bouton Supprimer nous définissons onclick qui est directement reporté dans la balise <a> sous forme d'un attribut onclick.

Création du fichier de classe

Dans le gabarit précédent, nous voyons que notre classe doit implémenter le gestionnaire d'évènement deletePost() (attaché à l'évènement Onclick de notre bouton Supprimer). Nous devons aussi lire les données du message dont l'ID est passé par un paramètre GET.

Nous implémentons la fonctionnalité suppression dans le classe ReadPost parce qu'il est classique de faire ainsi. Quand l'utilisateur clique sur le bouton Supprimer, une boite de dialogue demande confirmation de la suppression. Si l'utilisateur confirme, l'évènement OnClick du bouton Supprimer est déclenché. class ReadPost extends TPage { private $_post; /** * lis les données du message. * 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); // id du message passé par un paramètre GET $postID=(int)$this->Request['id']; // lis le message ainsi que les données correspondantes à l'auteur $this->_post=PostRecord::finder()->withAuthor()->findByPk($postID); if($this->_post===null) // si l'id du message est invalide throw new THttpException(500, 'Impossible de trouver le message demandé.'); // défini le titre de la page comme étant celui du message $this->Title=$this->_post->title; } /** * @return PostRecord retourne l'objet PostRecord correspondant au message */ public function getPost() { return $this->_post; } /** * supprime le message actuellement visualisé * cette méthode est appelée par l'évènement OnClick du bouton "Supprimer" */ public function deletePost($sender,$param) { // seul l'auteur ou un administrateur peuvent supprimer le message if(!$this->canEdit()) throw new THttpException('Nous n'êtes pas autorisé à effectuer cette action.'); // le supprime de la base de données $this->_post->delete(); // redirige le navigateur vers la page d'accueil $this->Response->redirect($this->Service->DefaultPageUrl); } /** * @return boolean infiquant si le message peut être modifier ou supprimer par l'utilisateur actuel */ public function canEdit() { // seul l'auteur ou un administrateur peuvent modifier/supprimer le message return $this->User->Name===$this->Post->author_id || $this->User->IsAdmin; } }

Test

Pour tester notre page ReadPost, allons à l'URL http://hostname/blog/index.php et cliquons sur le titre du seul message affiché. Notre navigateur devrait afficher le résultat suivant avec l'URL http://hostname/blog/index.php?page=ReadPost&id=1. Notez que si vous n'êtes pas connecté, les deux boutons ne sont pas visibles.