From 30795649ead5b7212cad32f9d5a9ca6152beba27 Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Wed, 29 Aug 2007 11:55:06 +0000 Subject: Indonesian Blog tutorial day 3,4, and 5 3rd tries --- .../protected/pages/Day4/id/CreateListPost.page | 185 +++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page (limited to 'demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page') diff --git a/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page b/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page new file mode 100644 index 00000000..d682535e --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day4/id/CreateListPost.page @@ -0,0 +1,185 @@ + + +

Membuat Halaman ListPost

+ +

+Halaman ListPost menampilkan tulisan blog terakhir dalam sebuah daftar. Jika di sana terlalu banyak tulisan, maka akan ditampilkan dalam beberapa lembar halaman. +

+ +

+Sebelum kita berlanjut dengan implementasi, kita ingin mengarahkan homepage kita ke halaman ListPage mendatang, karena kita ingin para pengguna melihat tulisan terakhir saat mereka menyentuh website. Untuk melakukannya, kita mengubah konfigurasi aplikasi protected/application.xml sebagai berikut, +

+ + +...... + + + + + + + +

+Sekarang kita membuat file template dan kelas untuk halaman ListPost: protected/pages/posts/ListPost.page dan protected/pages/posts/ListPost.php. +

+ +

Membuat Template Halaman

+

+Berdasarkan pada kebutuhan fungsionalitas halaman ListPost, kita akan menggunakan dua kontrol dalam template halaman: +

+ + +

+Di bawah ini adalah konten dalam template halaman: +

+ + +<%@ Title="My Blog" %> + +<com:TContent ID="Main"> + +<com:TRepeater ID="Repeater" + ItemRenderer="Application.pages.posts.PostRenderer" + AllowPaging="true" + AllowCustomPaging="true" + PageSize="5" + /> + +<com:TPager ControlToPaginate="Repeater" OnPageIndexChanged="pageChanged" /> + +</com:TContent> + + +

+Dalam pengulang, kita menetapkan bahwa konten yang diulang ditampilkan menggunakan penyaji item PostRenderer yang akan kita buat nantinya. Agar PRADO bisa menemukan kelas ini, kita memberikan namespace Application.pages.posts.PostRenderer, berarti file kelasnya adalah protected/pages/posts/PostRenderer.php. +

+ +

+Kita juga menyetel beberapa properti lain pada pengulang untuk menghidupkan lembaran halaman. Dan kita menyetel properti ControlToPaginate pada lembaran agar ia mengetahui konten mana yang diulang harus dibuat lembaran. +

+ + +

Membuat Kelas Halaman

+ +

+Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: pageChanged() (ditempelkan ke event lembaran OnPageIndexChanged). Kita juga perlu mempopulasikan data tulisan ke dalam pengulang berdasarkan pada setelan lembaran saat ini. Berikut ini adalah kode sumber lengkap kelas halaman: +

+ + +class ListPost extends TPage +{ + /** + * Menginisialisasi pengulang. + * Metode ini dipanggil oleh kerangka kerja saat menginisialisasi halaman + * @param mixed event parameter + */ + public function onInit($param) + { + parent::onInit($param); + if(!$this->IsPostBack) // jika halaman diminta pertama kali + { + // ambil jumlah total tulisan yang tersedia + $this->Repeater->VirtualItemCount=PostRecord::finder()->count(); + // populasikan data tulisan ke dalam pengulang + $this->populateData(); + } + } + + /** + * Pengendali event untuk event OnPageIndexChanged pada lembaran. + * Metode ini dipanggil saat pengguna mengklik tombol halaman + * dan kemudian mengubah halaman tulisan yang ditampilkan. + */ + public function pageChanged($sender,$param) + { + // ubah indeks halaman sekarang ke yang baru + $this->Repeater->CurrentPageIndex=$param->NewPageIndex; + // re-populasi data ke dalam pengulang + $this->populateData(); + } + + /** + * Menentukan halaman tulisan mana yang ditampilkan dan + * mempopulasi pengulang dengan data yang sudah diambil. + */ + protected function populateData() + { + $offset=$this->Repeater->CurrentPageIndex*$this->Repeater->PageSize; + $limit=$this->Repeater->PageSize; + if($offset+$limit>$this->Repeater->VirtualItemCount) + $limit=$this->Repeater->VirtualItemCount-$offset; + $this->Repeater->DataSource=$this->getPosts($offset,$limit); + $this->Repeater->dataBind(); + } + + /** + * Mengambil tulisan dari database dengan ofset dan limit. + */ + protected function getPosts($offset, $limit) + { + // Bentuk kriteria query + $criteria=new TActiveRecordCriteria; + $criteria->OrdersBy['create_time']='desc'; + $criteria->Limit=$limit; + $criteria->Offset=$offset; + // query untuk tulisan dengan kriteria di atas dan informasi pembuat + return PostRecord::finder()->withAuthor()->findAll($criteria); + } +} + + +

Membuat PostRenderer

+ +

+Kita masih perlu untuk membuat kelas penyaji item PostRenderer. 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 PostRenderer.tpl dan PostRenderer.php di bawah direktori protected/pages/posts. +

+ +

Membuat Template Penyaji

+

+Template penyaji menetapkan penyajian berbagai field dalam sebuah tulisan, termasuk judul, nama pembuat, waktu penulisan dan kontennya. Kita me-link judul tulisan ke ReadPost yang menampilkan lebih rinci atas tulisan yang dipilih. +

+

+Ekspresi $this->Data merujuk ke item data yang dikirimkan ke pengulang. Dalam kasus kita, ia adalah obyek PostRecord. Perhatikan bagaimana kita mengambil nama pembuat pada tulisan dengan $this->Data->author->username. +

+ + +
+

+<com:THyperLink Text="<%# $this->Data->title %>" + NavigateUrl="<%# $this->Service->constructUrl('posts.ReadPost',array('id'=>$this->Data->post_id)) %>" /> +

+ +

+Author: +<com:TLiteral Text="<%# $this->Data->author->username %>" />
+Time: +<com:TLiteral Text="<%# date('m/d/Y h:m:sa', $this->Data->create_time) %>" /> +

+ +

+<com:TLiteral Text="<%# $this->Data->content %>" /> +

+
+
+ +

Membuat Kelas Penyaji

+

+Kelas penyaji sangat sederhana. Ia diperluas dari TRepeaterItemRenderer dan tidak berisi kode apapun. +

+ +class PostRenderer extends TRepeaterItemRenderer +{ +} + + +

Pengujian

+

+Untuk menguji halaman ListPost, kunjungi URL http://hostname/blog/index.php (ingat kita telah menyetel ListPost 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 NewPost, kita dapat menambah tulisan lebih banyak dan datang kembali untuk menguji lembaran halaman lagi. +

+ + + +
\ No newline at end of file -- cgit v1.2.3