Membuat Halaman EditPost
Halaman EditPost disediakan bagi para pembuat dan administrator untuk mengedit tulisan blog yang sudah ada. Seperti halaman NewPost , ia menampilkan sebuah formulir untuk mengumpulkan perubahan terhadap judul dan konten tulisan.
Kita membuat dua file protected/pages/posts/EditPost.page dan protected/pages/posts/EditPost.php masing-masing untuk menyimpan template halaman dan kelas halaman.
Membuat Template Halaman
Template halaman EditPost sangat mirip dengan template NewPost. Hanya judul halaman dan tombol yang berbeda.
<%@ Title="My Blog - Edit Post" %>
<com:TContent ID="Main">
Edit Post
Title:
<com:TRequiredFieldValidator
ControlToValidate="TitleEdit"
ErrorMessage="Please provide a title."
Display="Dynamic" />
<com:TTextBox ID="TitleEdit" Columns="50" />
Content:
<com:TRequiredFieldValidator
ControlToValidate="ContentEdit"
ErrorMessage="Please provide content."
Display="Dynamic" />
<com:THtmlArea ID="ContentEdit" />
<com:TButton Text="Save" OnClick="saveButtonClicked" />
</com:TContent>
Membuat Kelas Halaman
Kelas halaman EditPage lebih kompleks dibanding NewPage karena ia perlu mengambil data tulisan yang ditetapkan terlebih dulu. Ia juga perlu melakukan pemeriksaan otorisasi tambahan. Ada kalanya ia perlu memastikan bahwa tulisan hanya bisa diedit oleh pembuat atau administrator. Pemeriksaan otorisasi sudah disediakan oleh PRADO.
class EditPost extends TPage
{
/**
* Menginisialisasi input dengan data tulisan yang sudah ada.
* Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi.
* @param parameter event campuran
*/
public function onInit($param)
{
parent::onInit($param);
// Menambil data pengguna yang sudah ada. Ini sama dengan:
// $postRecord=$this->getPost();
$postRecord=$this->Post;
// Pemeriksaan otorisasi: hanya pembuat atau administrator dapat mengedit tulisan
if($postRecord->author_id!==$this->User->Name && !$this->User->IsAdmin)
throw new THttpException(500,'You are not allowed to edit this post.');
if(!$this->IsPostBack) // jika halaman pertama kali diminta
{
// Mempopulasikan kontrol input dengan data tulisan yang sudah ada
$this->TitleEdit->Text=$postRecord->title;
$this->ContentEdit->Text=$postRecord->content;
}
}
/**
* Menyimpan tulisan jika semua input sudah benar.
* Metode ini merespon event OnClick pada tombol "Save".
* @param pengirim event campuran
* @param parameter event campuran
*/
public function saveButtonClicked($sender,$param)
{
if($this->IsValid) // jika semua validasi sukses
{
// Mengambil data pengguna yang sudah ada. Ini sama dengan:
// $postRecord=$this->getPost();
$postRecord=$this->Post;
// Mengambil data input
$postRecord->title=$this->TitleEdit->SafeText;
$postRecord->content=$this->ContentEdit->SafeText;
// menyimpan ke database via mekanisme Rekaman Aktif
$postRecord->save();
// mengalihkan browser ke halaman ReadPost
$url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
$this->Response->redirect($url);
}
}
/**
* Mengembalikan data tulisan yang akan diedit.
* @return PostRecord data tulisan yang akan diedit.
* @throws THttpException jika data tulisan tidak ada.
*/
protected function getPost()
{
// ID tulisan yang diedit dikirimkan via parameter GET 'id'
$postID=(int)$this->Request['id'];
// gunakan Rekaman Aktif untuk mencari ID tulisan tertentu
$postRecord=PostRecord::finder()->findByPk($postID);
if($postRecord===null)
throw new THttpException(500,'Post is not found.');
return $postRecord;
}
}
Pengujian
Untuk menguji halaman EditPost, masuk lebih dulu dan kemudian kunjungi URL berikut: http://hostname/blog/index.php?page=EditPost&id=1. URL ini juga bisa dijangkau dengan mengklik link Edit pada halaman rician tulisan.