Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<com:TContent ID="Main">
2
 
3
<h1>Membuat Halaman <tt>EditUser</tt></h1>
4
 
5
<p>
6
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.
7
</p>
8
 
9
<p>
10
Untuk menentukan akun pengguna mana yang diedit, kita menggunakan kebijakan berikut:
11
</p>
12
<ul>
13
<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>
14
<li>Jika pengguna saat ini adalah administrator dan URL tidak berisi 'username', data administrator sendiri sedang dimutakhirkan.</li>
15
<li>Jika pengguna saat ini adalah pengguna normal, dia hanya bisa mengedit informasi akunnya sendiri, dan dia tidak bisa memodifikasi data aturannya.</li>
16
</ul>
17
 
18
<p>
19
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.
20
</p>
21
 
22
<h2>Membuat Template Halaman</h2>
23
<p>
24
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.
25
</p>
26
<ul>
27
<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>
28
<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>
29
<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>
30
</ul>
31
</p>
32
 
33
<com:TTextHighlighter CssClass="source" Language="prado">
34
&lt;%@ Title="My Blog - Edit User" %>
35
 
36
&lt;com:TContent ID="Main">
37
 
38
<h1>Edit User</h1>
39
 
40
<span>Username:</span>
41
&lt;com:TLabel ID="Username" />
42
 
43
<br/>
44
<span>Password:</span>
45
<br/>
46
&lt;com:TTextBox ID="Password" TextMode="Password" />
47
 
48
<br/>
49
<span>Re-type Password:</span>
50
&lt;com:TCompareValidator
51
    ControlToValidate="Password"
52
    ControlToCompare="Password2"
53
    ErrorMessage="Your password entries did not match."
54
    Display="Dynamic" />
55
<br/>
56
&lt;com:TTextBox ID="Password2" TextMode="Password" />
57
 
58
<br/>
59
<span>Email Address:</span>
60
&lt;com:TRequiredFieldValidator
61
    ControlToValidate="Email"
62
    ErrorMessage="Please provide your email address."
63
    Display="Dynamic" />
64
&lt;com:TEmailAddressValidator
65
    ControlToValidate="Email"
66
    ErrorMessage="You entered an invalid email address."
67
    Display="Dynamic" />
68
<br/>
69
&lt;com:TTextBox ID="Email" />
70
 
71
&lt;com:TControl Visible="&lt;%= $this->User->IsAdmin %>">
72
<br/>
73
<span>Role:</span>
74
<br/>
75
&lt;com:TDropDownList ID="Role">
76
    &lt;com:TListItem Text="Normal User" Value="0" />
77
    &lt;com:TListItem Text="Administrator" Value="1" />
78
&lt;/com:TDropDownList>
79
&lt;/com:TControl>
80
 
81
<br/>
82
<span>First Name:</span>
83
<br/>
84
&lt;com:TTextBox ID="FirstName" />
85
 
86
<br/>
87
<span>Last Name:</span>
88
<br/>
89
&lt;com:TTextBox ID="LastName" />
90
 
91
<br/>
92
&lt;com:TButton Text="Save" OnClick="saveButtonClicked" />
93
 
94
&lt;/com:TContent>
95
</com:TTextHighlighter>
96
 
97
 
98
<h2>Membuat Kelas Halaman</h2>
99
 
100
<p>
101
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>.
102
</p>
103
 
104
<com:TTextHighlighter CssClass="source" Language="php">
105
class EditUser extends TPage
106
{
107
    /**
108
     * Menginisialisasi input dengan data pengguna yang sudah ada.
109
     * Metode ini dipanggil oleh kerangka kerja saat halaman diinisialisasi.
110
     * @param mixed event parameter
111
     */
112
    public function onInit($param)
113
    {
114
        parent::onInit($param);
115
        if(!$this->IsPostBack)  // jika halaman awalnya diminta
116
        {
117
            // Ambil data pengguna yang sudah ada. Ini sama dengan:
118
            // $userRecord=$this->getUserRecord();
119
            $userRecord=$this->UserRecord;
120
 
121
            // Populasikan kontrol input dengan data pengguna yang sudah ada
122
            $this->Username->Text=$userRecord->username;
123
            $this->Email->Text=$userRecord->email;
124
            $this->Role->SelectedValue=$userRecord->role;
125
            $this->FirstName->Text=$userRecord->first_name;
126
            $this->LastName->Text=$userRecord->last_name;
127
        }
128
    }
129
 
130
    /**
131
     * Menyimpan akun pengguna jika semua input sudah benar.
132
     * Metode ini merespon event OnClick pada tombol "save".
133
     * @param mixed event sender
134
     * @param mixed event parameter
135
     */
136
    public function saveButtonClicked($sender,$param)
137
    {
138
        if($this->IsValid)  // saat semua validasi sukses
139
        {
140
            // Ambil data pengguna yang sudah ada. Ini sama dengan:
141
            $userRecord=$this->UserRecord;
142
 
143
            // Ambil data input
144
            $userRecord->username=$this->Username->Text;
145
            // mutakhirkan kata sandi saat input tidak kosong
146
            if(!empty($this->Password->Text))
147
                $userRecord->password=$this->Password->Text;
148
            $userRecord->email=$this->Email->Text;
149
            // mutakhirkan aturan jika pengguna saat ini adalah administrator
150
            if($this->User->IsAdmin)
151
                $userRecord->role=(int)$this->Role->SelectedValue;
152
            $userRecord->first_name=$this->FirstName->Text;
153
            $userRecord->last_name=$this->LastName->Text;
154
 
155
            // simpan ke database melalui mekanisme Rekaman Aktif
156
            $userRecord->save();
157
 
158
            // alihkan browser ke homepage
159
			$this->Response->redirect($this->Service->DefaultPageUrl);
160
        }
161
    }
162
 
163
    /**
164
     * Mengembalikan data pengguna yang diedit.
165
     * @return UserRecord data pengguna yang diedit.
166
     * @throws THttpException jika data pengguna tidak ditemukan.
167
     */
168
    protected function getUserRecord()
169
    {
170
        // pengguna yang diedit adalah pengguna yang saat ini sudah masuk
171
        $username=$this->User->Name;
172
        // jika var GET 'username' tidak kosong dan pengguna saat ini adalah
173
        // administrator, lebih baik kita menggunakan nilai var GET.
174
        if($this->User->IsAdmin && $this->Request['username']!==null)
175
            $username=$this->Request['username'];
176
 
177
        // gunakan Rekaman Aktif untuk melihat nama pengguna yang ditetapkan
178
        $userRecord=UserRecord::finder()->findByPk($username);
179
        if(!($userRecord instanceof UserRecord))
180
            throw new THttpException(500,'Username is invalid.');
181
        return $userRecord;
182
    }
183
}
184
</com:TTextHighlighter>
185
 
186
<com:TipBox>
187
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>.
188
</com:TipBox>
189
 
190
<h2>Menambah Pemeriksaan Perijinan</h2>
191
<p>
192
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>.
193
</p>
194
 
195
<com:TTextHighlighter CssClass="source" Language="xml">
196
<?xml version="1.0" encoding="utf-8"?>
197
<configuration>
198
  <authorization>
199
    <allow roles="admin"/>
200
    <allow users="@" pages="EditUser"/>
201
    <deny users="*"/>
202
  </authorization>
203
</configuration>
204
</com:TTextHighlighter>
205
 
206
 
207
<h2>Pengujian</h2>
208
<p>
209
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.
210
</p>
211
 
212
</com:TContent>