Blame | Letzte Änderung | Log anzeigen | RSS feed
<com:TContent ID="Main"><h1>Membuat Halaman <tt>EditUser</tt></h1><p>Halaman <tt>EditUser</tt> sangat mirip dengan <a href="?page=Day3.CreateNewUser">NewUser</a>. Perbedaan utamanya adalah bahwa saat <tt>EditUser</tt> awalnya diminta, field input harus diinisialisasi dengan informasi pengguna yang sudah ada. Sedikit perbedaan lainnya adalah bahwa <tt>EditUser</tt> juga bisa diakses oleh pengguna normal.</p><p>Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut:</p><ul><li>Jika pengguna saat ini adalah administrator, dia dapat mengedit setiap akun pengguna dengan menetapkan akun nama pengguna dalam variabel GET bernama 'username'. Sebagai contoh, <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>.</li><li>Jika pengguna saat ini adalah administrator dan URL tidak berisi 'username', data administrator sendiri sedang dimutakhirkan.</li><li>Jika pengguna saat ini adalah pengguna normal, dia hanya bisa mengedit informasi akunnya sendiri, dan dia tidak bisa memodifikasi data aturannya.</li></ul><p>Kita membuat dua file <tt>protected/pages/users/EditUser.page</tt> dan <tt>protected/pages/users/EditUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.</p><h2>Membuat Template Halaman</h2><p>Seperti yang telah Anda tebak, template halaman <tt>EditUser</tt> sebagian besar sama seperti pada <tt>NewUser</tt>. Selain perbedaan dalam judul halaman dan judul tombol submit, ada tiga perbedaan utama.</p><ul><li>Kotak teks "username" diganti oleh kontrol <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.Label">TLabel</a> karena kita tidak membolehkan memodifikasi nama pengguna;</li><li>Validator untuk input "password" dihilangkan. Ini dikarenakan jika pengguna tidak melengkapi kata sandi selama mengedit, itu berarti pengguna tidak ingin mengubah kata sandi.</li><li>Input "role" dikelilingi oleh <tt>TControl</tt> 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.</li></ul></p><com:TTextHighlighter CssClass="source" Language="prado"><%@ Title="My Blog - Edit User" %><com:TContent ID="Main"><h1>Edit User</h1><span>Username:</span><com:TLabel ID="Username" /><br/><span>Password:</span><br/><com:TTextBox ID="Password" TextMode="Password" /><br/><span>Re-type Password:</span><com:TCompareValidatorControlToValidate="Password"ControlToCompare="Password2"ErrorMessage="Your password entries did not match."Display="Dynamic" /><br/><com:TTextBox ID="Password2" TextMode="Password" /><br/><span>Email Address:</span><com:TRequiredFieldValidatorControlToValidate="Email"ErrorMessage="Please provide your email address."Display="Dynamic" /><com:TEmailAddressValidatorControlToValidate="Email"ErrorMessage="You entered an invalid email address."Display="Dynamic" /><br/><com:TTextBox ID="Email" /><com:TControl Visible="<%= $this->User->IsAdmin %>"><br/><span>Role:</span><br/><com:TDropDownList ID="Role"><com:TListItem Text="Normal User" Value="0" /><com:TListItem Text="Administrator" Value="1" /></com:TDropDownList></com:TControl><br/><span>First Name:</span><br/><com:TTextBox ID="FirstName" /><br/><span>Last Name:</span><br/><com:TTextBox ID="LastName" /><br/><com:TButton Text="Save" OnClick="saveButtonClicked" /></com:TContent></com:TTextHighlighter><h2>Membuat Kelas Halaman</h2><p>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 <tt>saveButtonClicked()</tt> yang disertakan pada event tombol "save" <tt>OnClick</tt>.</p><com:TTextHighlighter CssClass="source" Language="php">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 kosongif(!empty($this->Password->Text))$userRecord->password=$this->Password->Text;$userRecord->email=$this->Email->Text;// mutakhirkan aturan jika pengguna saat ini adalah administratorif($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;}}</com:TTextHighlighter><com:TipBox>Metode <tt>onInit()</tt> dipanggil oleh PRADO selama salah satu <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Pages">masa hidup halaman</a>. Metode masa hidup umum lainnya ditimpa termasuk <tt>onPreInit()</tt>, <tt>onLoad()</tt> dan <tt>onPreRender()</tt>.</com:TipBox><h2>Menambah Pemeriksaan Perijinan</h2><p>Agar halaman <tt>EditUser</tt> juga bisa diakses oleh para pengguna (<tt>users="@"</tt>), kita juga perlu menyesuaikan file konfigurasi halaman <tt>protected/pages/users/config.xml</tt>.</p><com:TTextHighlighter CssClass="source" Language="xml"><?xml version="1.0" encoding="utf-8"?><configuration><authorization><allow roles="admin"/><allow users="@" pages="EditUser"/><deny users="*"/></authorization></configuration></com:TTextHighlighter><h2>Pengujian</h2><p>Untuk menguji halaman <tt>EditUser</tt>, kunjungi URL <tt>http://hostname/blog/index.php?page=users.EditUser&username=demo</tt>. 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.</p></com:TContent>