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:

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.

<%@ 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.