blob: 0922032239ddb1a0f3d4af3cca00ef9e5e990563 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
<com:TContent ID="Main">
<h1>Création de la page modification d'un message <tt>EditPost</tt></h1>
<p>
La page <tt>EditPost</tt> est fournie aux auteurs et administrateurs pour modifier les messages. Comme la page <a href="?page=Day4.CreateNewPost">NewPost</a>, elle affiche un formulaire permettant de modifier les données d'un message.
</p>
<p>
Nous créons deux fichiers <tt>protected/pages/posts/EditPost.page</tt> et <tt>protected/pages/posts/EditPost.php</tt> contenant respectivement le gabarit et la classe de notre page.
</p>
<h2>Création du gabarit</h2>
<p>
Le gabarit de la page <tt>EditPost</tt> est très proche de celui de la page <tt>NewPost</tt> template. Seul le titre et le texte du bouton sont différents.
</p>
<com:TTextHighlighter CssClass="source" Language="prado">
<%@ Title="Mon Blog - Modification Message" %>
<com:TContent ID="Main">
<h1>Modification message</h1>
<span>Titre:</span>
<com:TRequiredFieldValidator
ControlToValidate="TitleEdit"
ErrorMessage="Veuillez indiquer un titre."
Display="Dynamic" />
<br/>
<com:TTextBox ID="TitleEdit" Columns="50" />
<br/>
<span>Message:</span>
<com:TRequiredFieldValidator
ControlToValidate="ContentEdit"
ErrorMessage="Veuillez indiquer le contenu du message."
Display="Dynamic" />
<br/>
<com:THtmlArea ID="ContentEdit" />
<br/>
<com:TButton Text="Enregistrer" OnClick="saveButtonClicked" />
</com:TContent>
</com:TTextHighlighter>
<h2>Création du fichier de classe</h2>
<p>
La classe de <tt>EditPage</tt> est un peu plus complexe que celle de la page <tt>NewPage</tt> parce qu'elle doit lire les informations auparavant. Elle doit aussi vérifier les autorisations. En particulier, elle doit s'assurer que le message ne puisse être modifié que par l'auteur ou par un administrateur. Ces vérifications d'autorisation ne sont pas fournies par PRADO.
</p>
<com:TTextHighlighter CssClass="source" Language="php">
class EditPost extends TPage
{
/**
* initialise les contrôles de saisies avec 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);
// récupère les données de l'utilisateur. Equivalent à:
// $postRecord=$this->getPost();
$postRecord=$this->Post;
// vérification des droits: seul l'auteur ou un administrateur peuvent modifier le message
if($postRecord->author_id!==$this->User->Name && !$this->User->IsAdmin)
throw new THttpException(500,'Vous n êtes pas autoriser à modifier ce message.');
if(!$this->IsPostBack) // est-ce le premier appel à la page
{
// rempli les contrôles avec les données du message
$this->TitleEdit->Text=$postRecord->title;
$this->ContentEdit->Text=$postRecord->content;
}
}
/**
* Enregistre si toutes les validations 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 sont ok ?
{
// récupère les données de l'utilisateur. Equivalent à:
// $postRecord=$this->getPost();
$postRecord=$this->Post;
// affecte les données saisies aux champs de la BDD
$postRecord->title=$this->TitleEdit->SafeText;
$postRecord->content=$this->ContentEdit->SafeText;
// enregistre les données par la méthode save de l'Active Record
$postRecord->save();
// redirige le navigateur vers la page ReadPost
$url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
$this->Response->redirect($url);
}
}
/**
* retourne les données du message devant être modifiées.
* @return PostRecord les données devant être modifiés.
* @throws THttpException si le message est inexistant.
*/
protected function getPost()
{
// l'ID du message devant être modifié passé par un paramètre GET
$postID=(int)$this->Request['id'];
// utilise Active Record pour lire le message correspondant à cet ID
$postRecord=PostRecord::finder()->findByPk($postID);
if($postRecord===null)
throw new THttpException(500,'Message inexistant.');
return $postRecord;
}
}
</com:TTextHighlighter>
<h2>Test</h2>
<p>
Pour tester notre page <tt>EditPost</tt>, authentifiez-vous auparavant et allez à l'URL <tt>http://hostname/blog/index.php?page=EditPost&id=1</tt>. Cette URL peut aussi être atteinte par le bouton <tt>Modifier</tt> de notre page de détail.
</p>
<img src="<%~ output4.gif %>" class="output" />
</com:TContent>
|