Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Création de la page d'affichage des messages <tt>ListPost</tt></h1>
4
 
5
<p>
6
La page <tt>ListPost</tt> affiche les derniers messages sous forme de liste. S'il y a trop de messages, ils seront affichés dans différentes pages.
7
</p>
8
 
9
<p>
10
Avant que nous ne passions à l'implémentation, nous voudrions que notre page d'accueil pointe vers la page à venir <tt>ListPost</tt>, ceci dans le but d'afficher la liste des derniers messages dès qu'un utilisateur se connecte au site. Pour cela, nous allons modifier le fichier de configuration de l'application <tt>protected/application.xml</tt> de cette manière.
11
</p>
12
 
13
<com:TTextHighlighter CssClass="source" Language="xml">
14
......
15
<services>
16
  <service id="page" class="TPageService" DefaultPage="posts.ListPost">
17
    <pages MasterClass="Application.layouts.MainLayout" />
18
  </service>
19
</services>
20
</com:TTextHighlighter>
21
 
22
<p>
23
Nous alons maintenant créer le gabarit et le fichier de classe pour notre page <tt>ListPost</tt> : <tt>protected/pages/posts/ListPost.page</tt> et <tt>protected/pages/posts/ListPost.php</tt>.
24
</p>
25
 
26
<h2>Création du gabarit</h2>
27
<p>
28
Pour satisfaire les fonctionnalités de notre page <tt>ListPost</tt>, nous allons utiliser deux contrôles dans notre gabarit.
29
</p>
30
<ul>
31
<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: ce contrôle permet d'afficher principalement une liste d'éléments. La présentation de chacun ce ces éléments peut être défini soit par un gabarit interne, soit par un gabarit externe (choix que nous avons fait).</li>
32
<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Pager">TPager</a>: ce contrôle permet de faire la pagination d'une liste d'éléments. Il interagit avec l'utilisateur pour définir quelle page doit être affiché dans un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">contrôle de liste</a> (ie: <tt>TListBox</tt>) ou dans un <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Data">contrôle de données</a> (ie: <tt>TRepeater</tt>).</li>
33
</ul>
34
<p>
35
Ci-dessous le contenu du gabarit :
36
</p>
37
 
38
<com:TTextHighlighter CssClass="source" Language="prado">
39
&lt;%@ Title="Mon Blog" %>
40
 
41
&lt;com:TContent ID="Main">
42
 
43
&lt;com:TRepeater ID="Repeater"
44
	ItemRenderer="Application.pages.posts.PostRenderer"
45
	AllowPaging="true"
46
	AllowCustomPaging="true"
47
	PageSize="5"
48
	/>
49
 
50
&lt;com:TPager ControlToPaginate="Repeater" OnPageIndexChanged="pageChanged" />
51
 
52
&lt;/com:TContent>
53
</com:TTextHighlighter>
54
 
55
<p>
56
Dans la partie répétée <tt>TRepeater</tt>, nous indiquons que l'affichage du contenu est délégué à l'élément <tt>PostRenderer</tt> que nous allons créer après. Pour permettre à PRADO de trouver cette classe, nous fournissons l'espace de noms complet <tt>Application.pages.posts.PostRenderer</tt>, qui correspond au fichier <tt>protected/pages/posts/PostRenderer.php</tt>.
57
</p>
58
 
59
<p>
60
Nous définissons aussi quelques propriétés complémentaires du <tt>TRepeater</tt> pour activer la pagination. Et nous définissons la propriété <tt>ControlToPaginate</tt> du <tt>TPager</tt> afin qu'il sache quelle est la zone répetée à paginer.
61
</p>
62
 
63
 
64
<h2>Création du fichier de classe</h2>
65
<p>
66
En fonction du gabarit précédent, nous pouvons voir que notre fichier de classe doit implémenter un gestionnaire d'évènement pour <tt>pageChanged()</tt> (déclenché par <tt>OnPageIndexChanged</tt> du <tt>TPager</tt>). Nous devons aussi remplir les données qui apparaitront dans le <tt>TRepeater</tt>. Ci-dessous le source complet du fichier de classe :
67
</p>
68
 
69
<com:TTextHighlighter CssClass="source" Language="php">
70
class ListPost extends TPage
71
{
72
	/**
73
	 * Initialise le TRepeater.
74
	 * Cette méthode est appelé par le framework lors de l'initialisation de la page
75
	 * @param mixed param : paramètres de l'évènement
76
	 */
77
	public function onInit($param)
78
	{
79
		parent::onInit($param);
80
		if(!$this->IsPostBack)  // la page est chargée pour la première fois ?
81
		{
82
			// récupère le nombre total de messages
83
			$this->Repeater->VirtualItemCount=PostRecord::finder()->count();
84
			// rempli le TRepeater avec les données
85
			$this->populateData();
86
		}
87
	}
88
 
89
	/**
90
	 * Gestionnaire d'évènement pour OnPageIndexChanged du TPager.
91
	 * Cette méthode est appelée lors du changement de page
92
	 */
93
	public function pageChanged($sender,$param)
94
	{
95
		// change l'index de la page courante par le nouvel index
96
		$this->Repeater->CurrentPageIndex=$param->NewPageIndex;
97
		// rempli de nouveau le TRepeater
98
		$this->populateData();
99
	}
100
 
101
	/**
102
	 * détermine quelle page doit être affichée et remplie
103
	 * TRepeater avec les données lues
104
	 */
105
	protected function populateData()
106
	{
107
		$offset=$this->Repeater->CurrentPageIndex*$this->Repeater->PageSize;
108
		$limit=$this->Repeater->PageSize;
109
		if($offset+$limit>$this->Repeater->VirtualItemCount)
110
			$limit=$this->Repeater->VirtualItemCount-$offset;
111
		$this->Repeater->DataSource=$this->getPosts($offset,$limit);
112
		$this->Repeater->dataBind();
113
	}
114
 
115
	/**
116
	 * lis les données à partir de la base de données en utilisant les fonctionnalités offset et limit.
117
	 */
118
	protected function getPosts($offset, $limit)
119
	{
120
		// construit les critères de la requête
121
		$criteria=new TActiveRecordCriteria;
122
		$criteria->OrdersBy['create_time']='desc';
123
		$criteria->Limit=$limit;
124
		$criteria->Offset=$offset;
125
		// lit les messages en fonction des critères précédents
126
		return PostRecord::finder()->withAuthor()->findAll($criteria);
127
	}
128
}
129
</com:TTextHighlighter>
130
 
131
<h2>Création du <tt>PostRenderer</tt></h2>
132
 
133
<p>
134
Nous devons toujours créer la classe <tt>PostRenderer</tt>. Elle définit la manière dont sera affichée chaque ligne de notre <tt>TRepeater</tt>. Nous la créons en tant que gabarit de contrôle, ce qui nous permet d'utiliser notre système de gabarit. Le fichier de gabarit ainsi que notre fichier de classe seront sauvegardés respectivement sous <tt>PostRenderer.tpl</tt> et <tt>PostRenderer.php</tt> dans le dossier <tt>protected/pages/posts</tt>.
135
</p>
136
<h3>Création du gabarit pour <tt>PostRenderer</tt></h3>
137
<p>
138
Le gabarit définit la présentation des différentes informations d'un message : titre, nom, heure, contenu. Nous lions le titre à la page <tt>ReadPost</tt> qui affiche le détail du message.
139
</p>
140
<p>
141
L'expression <tt>$this->Data</tt> fait référence aux données provenant du <tt>TRepeater</tt>. Dans notre cas, c'est un objet de type <tt>PostRecord</tt>. Remarquez comment nous accédons au nom de l'auteur du message par <tt>$this->Data->author->username</tt>.
142
</p>
143
 
144
<com:TTextHighlighter CssClass="source" Language="prado">
145
<div class="post-box">
146
<h3>
147
&lt;com:THyperLink Text="&lt;%# $this->Data->title %>"
148
	NavigateUrl="&lt;%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
149
</h3>
150
 
151
<p>
152
Auteur:
153
&lt;com:TLiteral Text="&lt;%# $this->Data->author->username %>" /><br/>
154
Heure:
155
&lt;com:TLiteral Text="&lt;%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
156
</p>
157
 
158
<p>
159
&lt;com:TLiteral Text="&lt;%# $this->Data->content %>" />
160
</p>
161
</div>
162
</com:TTextHighlighter>
163
 
164
<h3>Création du fichier de classe pour <tt>PostRenderer</tt></h3>
165
 
166
<p>
167
Notre classe est très simple, elle hérite de <tt>TRepeaterItemRenderer</tt> et ne contient aucun autre code.
168
</p>
169
<com:TTextHighlighter CssClass="source" Language="php">
170
class PostRenderer extends TRepeaterItemRenderer
171
{
172
}
173
</com:TTextHighlighter>
174
 
175
<h2>Test</h2>
176
<p>
177
Pour tester la page <tt>ListPost</tt>, naviguons à l'URL <tt>http://hostname/blog/index.php</tt> (rappellez-vous, nous avons défini <tt>ListPost</tt> comme étant notre page d'accueil). Nous devrions obtenir le résultat suivant. vu que nous n'avons qu'un seul message pour le moment, le contrôle de pagination n'apparait pas. Plus tard, quand nous aurons fini la page <tt>NewPost</tt>, nous pourrons ajouter des messages et revenir ici pour tester notre contrôle de pagination.
178
</p>
179
 
180
<img src="<%~ output.gif %>" class="output" />
181
 
182
</com:TContent>