Membuat Halaman EditUser
Halaman EditUser sangat mirip dengan NewUser. Perbedaan utamanya adalah bahwa saat EditUser awalnya diminta, field input harus diinisialisasi dengan informasi pengguna yang sudah ada. Sedikit perbedaan lainnya adalah bahwa EditUser juga bisa diakses oleh pengguna normal.
Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut:
- Jika pengguna saat ini adalah administrator, dia dapat mengedit setiap akun pengguna dengan menetapkan akun nama pengguna dalam variabel GET bernama 'username'. Sebagai contoh, http://hostname/blog/index.php?page=users.EditUser&username=demo.
- Jika pengguna saat ini adalah administrator dan URL tidak berisi 'username', data administrator sendiri sedang dimutakhirkan.
- Jika pengguna saat ini adalah pengguna normal, dia hanya bisa mengedit informasi akunnya sendiri, dan dia tidak bisa memodifikasi data aturannya.
Kita membuat dua file protected/pages/users/EditUser.page dan protected/pages/users/EditUser.php masing-masing untuk menyimpan template halaman dan kelas halaman.
Membuat Template Halaman
Seperti yang telah Anda tebak, template halaman EditUser sebagian besar sama seperti pada NewUser. Selain perbedaan dalam judul halaman dan judul tombol submit, ada tiga perbedaan utama.
- Kotak teks "username" diganti oleh kontrol TLabel karena kita tidak membolehkan memodifikasi nama pengguna;
- Validator untuk input "password" dihilangkan. Ini dikarenakan jika pengguna tidak melengkapi kata sandi selama mengedit, itu berarti pengguna tidak ingin mengubah kata sandi.
- Input "role" dikelilingi oleh TControl yang penampakannya dihidup matikan berdasarkan aturan pengguna yang masuk saat ini. Jika pengguna bukan administrator, input "role" tidak akan ditampilkan karena pengguna normal tidak diperbolehkan untuk memodifikasi aturannya.
<%@ Title="My Blog - Edit User" %>
<com:TContent ID="Main">
Edit User
Username:
<com:TLabel ID="Username" />
Password:
<com:TTextBox ID="Password" TextMode="Password" />
Re-type Password:
<com:TCompareValidator
ControlToValidate="Password"
ControlToCompare="Password2"
ErrorMessage="Your password entries did not match."
Display="Dynamic" />
<com:TTextBox ID="Password2" TextMode="Password" />
Email Address:
<com:TRequiredFieldValidator
ControlToValidate="Email"
ErrorMessage="Please provide your email address."
Display="Dynamic" />
<com:TEmailAddressValidator
ControlToValidate="Email"
ErrorMessage="You entered an invalid email address."
Display="Dynamic" />
<com:TTextBox ID="Email" />
<com:TControl Visible="<%= $this->User->IsAdmin %>">
Role:
<com:TDropDownList ID="Role">
<com:TListItem Text="Normal User" Value="0" />
<com:TListItem Text="Administrator" Value="1" />
</com:TDropDownList>
</com:TControl>
First Name:
<com:TTextBox ID="FirstName" />
Last Name:
<com:TTextBox ID="LastName" />
<com:TButton Text="Save" OnClick="saveButtonClicked" />
</com:TContent>
Membuat Kelas Halaman
Berdasarkan pada deskripsi di atas dan template, kita perlu menulis kelas halaman yang mengawali input dengan informasi pengguna yang sudah ada. Sebagai tambahan, kelas halaman juga perlu untuk mengimplementasikan metode saveButtonClicked() yang disertakan pada event tombol "save" OnClick.
class EditUser extends TPage
{
/**
* Menginisialisasi input dengan data pengguna yang sudah ada.
* Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi.
* @param mixed event parameter
*/
public function onInit($param)
{
parent::onInit($param);
if(!$this->IsPostBack) // jika halaman awalnya diminta
{
// Ambil data pengguna yang sudah ada. Ini sama dengan:
// $userRecord=$this->getUserRecord();
$userRecord=$this->UserRecord;
// Populasikan kontrol input dengan data pengguna yang sudah ada
$this->Username->Text=$userRecord->username;
$this->Email->Text=$userRecord->email;
$this->Role->SelectedValue=$userRecord->role;
$this->FirstName->Text=$userRecord->first_name;
$this->LastName->Text=$userRecord->last_name;
}
}
/**
* Menyimpan akun pengguna jika semua input sudah benar.
* Metode ini merespon event OnClick pada tombol "save".
* @param mixed event sender
* @param mixed event parameter
*/
public function saveButtonClicked($sender,$param)
{
if($this->IsValid) // saat semua validasi sukses
{
// Ambil data pengguna yang sudah ada. Ini sama dengan:
$userRecord=$this->UserRecord;
// Ambil data input
$userRecord->username=$this->Username->Text;
// mutakhirkan kata sandi saat input tidak kosong
if(!empty($this->Password->Text))
$userRecord->password=$this->Password->Text;
$userRecord->email=$this->Email->Text;
// mutakhirkan aturan jika pengguna saat ini adalah administrator
if($this->User->IsAdmin)
$userRecord->role=(int)$this->Role->SelectedValue;
$userRecord->first_name=$this->FirstName->Text;
$userRecord->last_name=$this->LastName->Text;
// simpan ke database melalui mekanisme Rekaman Aktif
$userRecord->save();
// alihkan browser ke homepage
$this->Response->redirect($this->Service->DefaultPageUrl);
}
}
/**
* Mengembalikan data pengguna yang diedit.
* @return UserRecord data pengguna yang diedit.
* @throws THttpException jika data pengguna tidak ditemukan.
*/
protected function getUserRecord()
{
// pengguna yang diedit adalah pengguna yang saat ini sudah masuk
$username=$this->User->Name;
// jika var GET 'username' tidak kosong dan pengguna saat ini adalah
// administrator, lebih baik kita menggunakan nilai var GET.
if($this->User->IsAdmin && $this->Request['username']!==null)
$username=$this->Request['username'];
// gunakan Rekaman Aktif untuk melihat nama pengguna yang ditetapkan
$userRecord=UserRecord::finder()->findByPk($username);
if(!($userRecord instanceof UserRecord))
throw new THttpException(500,'Username is invalid.');
return $userRecord;
}
}
Metode onInit() dipanggil oleh PRADO selama salah satu masa hidup halaman. Metode masa hidup umum lainnya ditimpa termasuk onPreInit(), onLoad() dan onPreRender().
Pengujian
Untuk menguji halaman EditUser, kunjungi URL http://hostname/blog/index.php?page=users.EditUser&username=demo. Anda mungkin perlu masuk lebih dulu jika Anda belum melakukannya. Coba masuk dengan akun berbeda (e.g. admin/demo, demo/demo) dan lihat bagaimana halaman ditampilkan secara berbeda.