Membuat Halaman ReadPost

Halaman ReadPost menampilkan rincian konten tulisan blog. Untuk para pengguna yang diotorisasi, akan ditampilkan tombol link yang membolehkan mereka untuk mengedit atau menghapus tulisan.

Kita membuat dua file protected/pages/posts/ReadPost.page dan protected/pages/posts/ReadPost.php masing-masing untuk menyimpan template halaman dan kelas halaman.

Membuat Template Halaman

Template halaman ReadPost sangat mirip dengan template PostRenderer, keduanya menyajikan konten tulisan. Perbedaannya adalah bahwa ReadPost perlu menampilkan dua tombol link ketika pengguna saat ini diotorisasi untuk mengedit atau menghapus tulisan.

<com:TContent ID="Main">

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

<com:TControl Visible="<%= $this->canEdit() %>"> Edit | <com:TLinkButton Text="Delete" OnClick="deletePost" Attributes.onclick="javascript:if(!confirm('Are you sure?')) return false;" /> </com:TControl>

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

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

</com:TContent>

Banyak ekspresi PHP dipakai dalam template di atas. Ekspresi $this->Post merujuk ke properti yang didefinisikan dalam kelas halaman ReadPost. Ia mewakili obyek PostRecord yang terkait dengan tulisan yang saat ini sedang dilihat.

Meskipun sebagian besar kita menggunakan ekspresi dalam template, we do not overuse them. A major guideline in determining whether we should use an expression in a template is that the expression should be a property or a simple presentational transformation of the property. By following this guideline, we ensure content and presentation are well separated without losing sufficient flexibility.

Kita juga mencatatan dalam template di atas bahwa dua link tombol dikurung di dalam TControl yang penampakannya ditentukan oleh ekspresi $this->canEdit(). Untuk link tombol Delete, kita menggunakan dialog konfirmasi javascript untuk memperoleh konfirmasi pengguna saat ia mengklik untuk menghapus tulisan.

Seluruh kontrol PRADO mempunyai properti yang sangat berguna bernama Attributes yang dapat menerima pasangan nama-nilai bebas. Kebanyakan kontrol PRADO akan menyajikan pasangan nama-nilai dalam Attributes secara literal terkait tag HTML. Sebagai contoh, daam link tombol Delete di atas, kita mendefinisikan sebuah onclick yang disajikan sebagai atribut onclick yang menghasilkan tag <a>.

Membuat Kelas Halaman

Dari template halaman di atas, kita melihat bahwa kita perlu menulis kelas halaman yang mengimplementasikan pengendali event: deletePost() (ditempelkan ke tombol Delete dalam event OnClick). Kita juga perlu untuk mengambil data tulisan yang ditetapkan oleh ID tulisan melalui parameter GET id.

Kita mengimplementasikan fitur penghapusan tulisan dalam halaman ReadPost karena ini sangat alami untuk melakukannya di sini. Ketika pengguna mengklik pada tombol Delete, dialog konfirmasi javascript akan muncul. Jika pengguna mengkonfirmasinya, penghapusan akan dibawa dalam respon terhadap event OnClick dari tombol Delete. class ReadPost extends TPage { private $_post; /** * Mengambil data tulisan. * Metode ini dipanggil oleh kerangka kerja saat inisialisasi halaman * @param mixed event parameter */ public function onInit($param) { parent::onInit($param); // id tulisan dikirimkan via parameter GET 'id' $postID=(int)$this->Request['id']; // mengambil PostRecord dengan informasi pembuat terisi dalam $this->_post=PostRecord::finder()->withAuthor()->findByPk($postID); if($this->_post===null) // jika id tulisan tidak benar throw new THttpException(500,'Unable to find the specified post.'); // setel judul halaman sebagai judul tulisan $this->Title=$this->_post->title; } /** * @return PostRecord yang saat ini sedang dilihat */ public function getPost() { return $this->_post; } /** * Menghapus tulisan yang saat ini sedang dilihat * Metode ini dipanggil saat pengguna mengklik tombol "Delete" */ public function deletePost($sender,$param) { // hanya pembuat atau administrator bisa menghapus tulisan if(!$this->canEdit()) throw new THttpException('You are not allowed to perform this action.'); // hapus dari DB $this->_post->delete(); // alihkan browser ke homepage $this->Response->redirect($this->Service->DefaultPageUrl); } /** * @return boolean apakah pengguna saat ini bisa mengedit/menghapus tulisan yg sedang dilihat */ public function canEdit() { // hanya pembuat atau administrator bisa mengedi/menghapus tulisan return $this->User->Name===$this->Post->author_id || $this->User->IsAdmin; } }

Pengujian

Untuk menguji halaman ReadPost, kunjungi URL http://hostname/blog/index.php dan klik pada judul tulisan. Browser kita akan menampilkan hasil berikut dengan URL http://hostname/blog/index.php?page=ReadPost&id=1. Catatan, jika kita tidak masuk, dua tombol link tidak akan terlihat.