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>Membuat Halaman <tt>ListPost</tt></h1>
4
 
5
<p>
6
Halaman <tt>ListPost</tt> menampilkan tulisan blog terakhir dalam sebuah daftar. Jika di sana terlalu banyak tulisan, maka akan ditampilkan dalam beberapa lembar halaman.
7
</p>
8
 
9
<p>
10
Sebelum kita berlanjut dengan implementasi, kita ingin mengarahkan homepage kita ke halaman <tt>ListPage</tt> mendatang, karena kita ingin para pengguna melihat tulisan terakhir saat mereka menyentuh website. Untuk melakukannya, kita mengubah konfigurasi aplikasi <tt>protected/application.xml</tt> sebagai berikut,
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
Sekarang kita membuat file template dan kelas untuk halaman <tt>ListPost</tt>: <tt>protected/pages/posts/ListPost.page</tt> dan <tt>protected/pages/posts/ListPost.php</tt>.
24
</p>
25
 
26
<h2>Membuat Template Halaman</h2>
27
<p>
28
Berdasarkan pada kebutuhan fungsionalitas halaman <tt>ListPost</tt>, kita akan menggunakan dua kontrol dalam template halaman:
29
</p>
30
<ul>
31
<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Repeater">TRepeater</a>: kontrol ini dipakai terutama untuk menampilkan daftar atas item data. Penyajian dari setiap item data bisa ditetapkan melalui template inline atau kontrol template eksternal (pendekatan yang akan kita gunakan di sini).</li>
32
<li><a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Pager">TPager</a>: kontrol ini dipakai untuk memecah daftar item data. Ia berinteraksi dengan pengguna-akhir untuk menentukan halaman data mana yang ditampilkan dalam <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.List">kontrol daftar</a> (misalnya <tt>TListBox</tt>) pada <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Data">kontrol data</a> (misalnya <tt>TRepeater</tt>).</li>
33
</ul>
34
 
35
<p>
36
Di bawah ini adalah konten dalam template halaman:
37
</p>
38
 
39
<com:TTextHighlighter CssClass="source" Language="prado">
40
&lt;%@ Title="My Blog" %>
41
 
42
&lt;com:TContent ID="Main">
43
 
44
&lt;com:TRepeater ID="Repeater"
45
	ItemRenderer="Application.pages.posts.PostRenderer"
46
	AllowPaging="true"
47
	AllowCustomPaging="true"
48
	PageSize="5"
49
	/>
50
 
51
&lt;com:TPager ControlToPaginate="Repeater" OnPageIndexChanged="pageChanged" />
52
 
53
&lt;/com:TContent>
54
</com:TTextHighlighter>
55
 
56
<p>
57
Dalam pengulang, kita menetapkan bahwa konten yang diulang ditampilkan menggunakan penyaji item <tt>PostRenderer</tt> yang akan kita buat nantinya. Agar PRADO bisa menemukan kelas ini, kita memberikan namespace <tt>Application.pages.posts.PostRenderer</tt>, berarti file kelasnya adalah <tt>protected/pages/posts/PostRenderer.php</tt>.
58
</p>
59
 
60
<p>
61
Kita juga menyetel beberapa properti lain pada pengulang untuk menghidupkan lembaran halaman. Dan kita menyetel properti <tt>ControlToPaginate</tt> pada lembaran agar ia mengetahui konten mana yang diulang harus dibuat lembaran.
62
</p>
63
 
64
 
65
<h2>Membuat Kelas Halaman</h2>
66
 
67
<p>
68
Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali  event: <tt>pageChanged()</tt> (ditempelkan ke event lembaran <tt>OnPageIndexChanged</tt>). Kita juga perlu mempopulasikan data tulisan ke dalam pengulang berdasarkan pada setelan lembaran saat ini. Berikut ini adalah kode sumber lengkap kelas halaman:
69
</p>
70
 
71
<com:TTextHighlighter CssClass="source" Language="php">
72
class ListPost extends TPage
73
{
74
	/**
75
	 * Menginisialisasi pengulang.
76
	 * Metode ini dipanggil oleh kerangka kerja saat menginisialisasi halaman
77
	 * @param mixed event parameter
78
	 */
79
	public function onInit($param)
80
	{
81
		parent::onInit($param);
82
		if(!$this->IsPostBack)  // jika halaman diminta pertama kali
83
		{
84
			// ambil jumlah total tulisan yang tersedia
85
			$this->Repeater->VirtualItemCount=PostRecord::finder()->count();
86
			// populasikan data tulisan ke dalam pengulang
87
			$this->populateData();
88
		}
89
	}
90
 
91
	/**
92
	 * Pengendali event untuk event OnPageIndexChanged pada lembaran.
93
	 * Metode ini dipanggil saat pengguna mengklik tombol halaman
94
	 * dan kemudian mengubah halaman tulisan yang ditampilkan.
95
	 */
96
	public function pageChanged($sender,$param)
97
	{
98
		// ubah indeks halaman sekarang ke yang baru
99
		$this->Repeater->CurrentPageIndex=$param->NewPageIndex;
100
		// re-populasi data ke dalam pengulang
101
		$this->populateData();
102
	}
103
 
104
	/**
105
	 * Menentukan halaman tulisan mana yang ditampilkan dan
106
	 * mempopulasi pengulang dengan data yang sudah diambil.
107
	 */
108
	protected function populateData()
109
	{
110
		$offset=$this->Repeater->CurrentPageIndex*$this->Repeater->PageSize;
111
		$limit=$this->Repeater->PageSize;
112
		if($offset+$limit>$this->Repeater->VirtualItemCount)
113
			$limit=$this->Repeater->VirtualItemCount-$offset;
114
		$this->Repeater->DataSource=$this->getPosts($offset,$limit);
115
		$this->Repeater->dataBind();
116
	}
117
 
118
	/**
119
	 * Mengambil tulisan dari database dengan ofset dan limit.
120
	 */
121
	protected function getPosts($offset, $limit)
122
	{
123
		// Bentuk kriteria query
124
		$criteria=new TActiveRecordCriteria;
125
		$criteria->OrdersBy['create_time']='desc';
126
		$criteria->Limit=$limit;
127
		$criteria->Offset=$offset;
128
		// query untuk tulisan dengan kriteria di atas dan informasi pembuat
129
		return PostRecord::finder()->withAuthor()->findAll($criteria);
130
	}
131
}
132
</com:TTextHighlighter>
133
 
134
<h2>Membuat <tt>PostRenderer</tt></h2>
135
 
136
<p>
137
Kita masih perlu untuk membuat kelas penyaji item <tt>PostRenderer</tt>. Ia mendefinisikan bagaimana setiap tulisan harus ditampilkan dalam pengulang. Kita membuatnya sebagai kontrol template yang membolehkan kita untuk menetapkan penyajian tulisan menggunakan sintaks template fleksibel kita. Template dan file kelas masing-masing disimpan sebagai <tt>PostRenderer.tpl</tt> dan <tt>PostRenderer.php</tt> di bawah direktori <tt>protected/pages/posts</tt>.
138
</p>
139
 
140
<h3>Membuat Template Penyaji</h3>
141
<p>
142
Template penyaji menetapkan penyajian berbagai field dalam sebuah tulisan, termasuk judul, nama pembuat, waktu penulisan dan kontennya. Kita me-link judul tulisan ke <tt>ReadPost</tt> yang menampilkan lebih rinci atas tulisan yang dipilih.
143
</p>
144
<p>
145
Ekspresi <tt>$this->Data</tt> merujuk ke item data yang dikirimkan ke pengulang. Dalam kasus kita, ia adalah obyek <tt>PostRecord</tt>. Perhatikan bagaimana kita mengambil nama pembuat pada tulisan dengan <tt>$this->Data->author->username</tt>.
146
</p>
147
 
148
<com:TTextHighlighter CssClass="source" Language="prado">
149
<div class="post-box">
150
<h3>
151
&lt;com:THyperLink Text="&lt;%# $this->Data->title %>"
152
	NavigateUrl="&lt;%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" />
153
</h3>
154
 
155
<p>
156
Author:
157
&lt;com:TLiteral Text="&lt;%# $this->Data->author->username %>" /><br/>
158
Time:
159
&lt;com:TLiteral Text="&lt;%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" />
160
</p>
161
 
162
<p>
163
&lt;com:TLiteral Text="&lt;%# $this->Data->content %>" />
164
</p>
165
</div>
166
</com:TTextHighlighter>
167
 
168
<h3>Membuat Kelas Penyaji</h3>
169
<p>
170
Kelas penyaji sangat sederhana. Ia diperluas dari <tt>TRepeaterItemRenderer</tt> dan tidak berisi kode apapun.
171
</p>
172
<com:TTextHighlighter CssClass="source" Language="php">
173
class PostRenderer extends TRepeaterItemRenderer
174
{
175
}
176
</com:TTextHighlighter>
177
 
178
<h2>Pengujian</h2>
179
<p>
180
Untuk menguji halaman <tt>ListPost</tt>, kunjungi URL <tt>http://hostname/blog/index.php</tt> (ingat kita telah menyetel  <tt>ListPost</tt> sebagai homepage baru kita). Kita akan melihat hasil seperti berikut. Karena kita hanya mempunyai satu tulisan saat ini, lembaran tidak akan muncul. Nantinya ketika menyelesaikan <tt>NewPost</tt>, kita dapat menambah tulisan lebih banyak dan datang kembali untuk menguji lembaran halaman lagi.
181
</p>
182
 
183
<img src="<%~ output.gif %>" class="output" />
184
 
185
</com:TContent>