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>NewUser</tt></h1>
4
 
5
<p>
6
Halaman <tt>NewUser</tt> disediakan untuk pengguna administrator guna membuat akun pengguna baru. Ini perlu menampilkan sebuah formulir yang mengumpulkan informasi mengenai akun pengguna baru. Berdasarkan <a href="?page=Day2.CreateDB">definisi database</a>, kita akan perlu mengumpulkan informasi berikut:
7
</p>
8
 
9
<ul>
10
<li><tt>username</tt> - string, diperlukan dan unik</li>
11
<li><tt>email</tt> - string, diperlukan dan unik</li>
12
<li><tt>password</tt> - string, diperlukan</li>
13
<li><tt>role</tt> - integer, diperlukan (baik 0 ataupun 1)</li>
14
<li><tt>first_name</tt> - string, opsional</li>
15
<li><tt>last_name</tt> - string, opsional</li>
16
</ul>
17
 
18
<p>
19
Kita membuat dua file <tt>protected/pages/users/NewUser.page</tt> dan <tt>protected/pages/users/NewUser.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
20
</p>
21
 
22
<h2>Membuat Template Halaman</h2>
23
<p>
24
Berdasarkan pada analisis di atas, kita menulis template halaman seperti berikut:
25
</p>
26
 
27
<com:TTextHighlighter CssClass="source" Language="prado">
28
&lt;%@ Title="My Blog - New User" %>
29
 
30
&lt;com:TContent ID="Main">
31
 
32
<h1>Create New User</h1>
33
 
34
<span>Username:</span>
35
&lt;com:TRequiredFieldValidator
36
    ControlToValidate="Username"
37
    ErrorMessage="Please provide a username."
38
    Display="Dynamic" />
39
&lt;com:TCustomValidator
40
    ControlToValidate="Username"
41
    ErrorMessage="Sorry, your username is taken by someone else. Please choose another username."
42
    OnServerValidate="checkUsername"
43
    Display="Dynamic" />
44
<br/>
45
&lt;com:TTextBox ID="Username" />
46
 
47
<br/>
48
<span>Password:</span>
49
&lt;com:TRequiredFieldValidator
50
    ControlToValidate="Password"
51
    ErrorMessage="Please provide a password."
52
    Display="Dynamic" />
53
<br/>
54
&lt;com:TTextBox ID="Password" TextMode="Password" />
55
 
56
<br/>
57
<span>Re-type Password:</span>
58
&lt;com:TCompareValidator
59
    ControlToValidate="Password"
60
    ControlToCompare="Password2"
61
    ErrorMessage="Your password entries did not match."
62
    Display="Dynamic" />
63
<br/>
64
&lt;com:TTextBox ID="Password2" TextMode="Password" />
65
 
66
<br/>
67
<span>Email Address:</span>
68
&lt;com:TRequiredFieldValidator
69
    ControlToValidate="Email"
70
    ErrorMessage="Please provide your email address."
71
    Display="Dynamic" />
72
&lt;com:TEmailAddressValidator
73
    ControlToValidate="Email"
74
    ErrorMessage="You entered an invalid email address."
75
    Display="Dynamic" />
76
<br/>
77
&lt;com:TTextBox ID="Email" />
78
 
79
<br/>
80
<span>Role:</span>
81
<br/>
82
&lt;com:TDropDownList ID="Role">
83
    &lt;com:TListItem Text="Normal User" Value="0" />
84
    &lt;com:TListItem Text="Administrator" Value="1" />
85
&lt;/com:TDropDownList>
86
 
87
<br/>
88
<span>First Name:</span>
89
<br/>
90
&lt;com:TTextBox ID="FirstName" />
91
 
92
<br/>
93
<span>Last Name:</span>
94
<br/>
95
&lt;com:TTextBox ID="LastName" />
96
 
97
<br/>
98
&lt;com:TButton Text="Create" OnClick="createButtonClicked" />
99
 
100
&lt;/com:TContent>
101
</com:TTextHighlighter>
102
 
103
<p>
104
Template tidak jauh berbeda dari template <tt>Contact</tt> dan halaman <tt>LoginUser</tt>. Sebagian besar terdiri dari kotak teks dan validator. Beberapa kotak teks, seperti nama pengguna, dikaitkan dengan dua validator karena keterlibatan aturan multipel validasi.
105
</p>
106
 
107
 
108
<h2>Membuat Kelas Halaman</h2>
109
 
110
<p>
111
Dari template halaman di atas, kita melihat bahwa kita perlu untuk menulis sebuah kelas halaman yang mengimplementasikan dua pengendali event: <tt>checkUsername()</tt> (disertakan ke event validator kustom <tt>OnServerValidate</tt>) dan <tt>createButtonClicked()</tt> (disertakan ke event tombol "create" <tt>OnClick</tt>). Oleh karena itu, kita menulis kelas halaman seperti berikut:
112
</p>
113
 
114
<com:TTextHighlighter CssClass="source" Language="php">
115
class NewUser extends TPage
116
{
117
    /**
118
     * Memeriksa apakah nama pengguna sudah ada dalam database.
119
     * Metode ini merespon ke event OnServerValidate pada validator kustom nama pengguna.
120
     * @param mixed event sender
121
     * @param mixed event parameter
122
     */
123
    public function checkUsername($sender,$param)
124
    {
125
        // benar jika nama pengguna tidak ditemukan dalam database
126
        $param->IsValid=UserRecord::finder()->findByPk($this->Username->Text)===null;
127
    }
128
 
129
    /**
130
     * Membuat akun pengguna baru jika semua input benar.
131
     * Metode ini merespon ke event OnClick pada tombol "create".
132
     * @param mixed event sender
133
     * @param mixed event parameter
134
     */
135
    public function createButtonClicked($sender,$param)
136
    {
137
        if($this->IsValid)  // ketika semua validasi sukses
138
        {
139
            // populasikan obyek UserRecord dengan input pengguna
140
            $userRecord=new UserRecord;
141
            $userRecord->username=$this->Username->Text;
142
            $userRecord->password=$this->Password->Text;
143
            $userRecord->email=$this->Email->Text;
144
            $userRecord->role=(int)$this->Role->SelectedValue;
145
            $userRecord->first_name=$this->FirstName->Text;
146
            $userRecord->last_name=$this->LastName->Text;
147
 
148
            // simpan database melalui mekanisme Rekaman Aktif
149
            $userRecord->save();
150
 
151
            // alihkan browser ke homepage
152
			$this->Response->redirect($this->Service->DefaultPageUrl);
153
        }
154
    }
155
}
156
</com:TTextHighlighter>
157
 
158
<p>
159
Dalam kode di atas, memanggil <tt>save()</tt> akan menyisipkan baris baru dalam tabel <tt>users</tt>. Fitur intuitif ini dihidupkan oleh <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
160
</p>
161
 
162
<com:NoteBox>
163
Untuk memudahkan, nama pengguna dalam sistem blg kita adalah tidak sensitif-huruf! Dalam banyak sistem praktis, nama pengguna mungkin perlu sensitif-huruf. Maka penanganan khusus perlu dibuat saat pembuatan akun pengguna baru dan juga <a href="?page=Day3.Auth">melakukan otentikasi</a>. Juga, ruang kosong dalam nama pengguna perlu dipotong ketika membuat akun baru dengan itu.
164
</com:NoteBox>
165
 
166
 
167
<h2>Pengujian</h2>
168
<p>
169
Untuk menguji halaman <tt>NewUser</tt>, kunjungi URL <tt>http://hostname/blog/index.php?page=users.NewUser</tt>. Kita akan melihat output halaman berikut. Coba masukan informasi berbeda ke dalam formulir dan lihat bagaimana input divalidasi. Jika semua aturan validasi memuaskan, kita akan mengharapkan akun pengguna dibuat dan browser dialihkan ke homepage.
170
</p>
171
 
172
<img src="<%~ output2.gif %>" class="output"/>
173
 
174
 
175
<h2>Menambahkan Pemeriksaan Perijinan</h2>
176
<p>
177
Selama pengujian, Anda mungkin bertanya: apakah halaman <tt>NewUser</tt> seharusnya hanya bisa diakses oleh pengguna administrator? Ya, ini disebut <a href="http://www.pradosoft.com/demos/quickstart/?page=Advanced.Auth">otorisasi</a>. Sekarang kami menjelaskan bagaimana kita menambahkan pemeriksaan perijinan ini ke halaman <tt>NewUser</tt>.
178
</p>
179
 
180
<p>
181
Cara langsung pada pemeriksaan perijinan adalah dalam kelas halaman di mana kita memeriksa apakah <tt>$this->User->IsAdmin</tt> adalah true, dan jika tidak, kita mengalihkan browser ke halaman <tt>LoginUser</tt>.
182
</p>
183
 
184
<p>
185
PRADO menawarkan cara lebih sistematis terhadap pemeriksaan perijinan akses halaman. Untuk melakukannyaTo , kita perlu menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Configurations.PageConfig">konfigurasi halaman</a>. Membuat sebuah file <tt>protected/pages/users/config.xml</tt> dengan konten seperti berikut:
186
</p>
187
 
188
<com:TTextHighlighter CssClass="source" Language="xml">
189
<?xml version="1.0" encoding="utf-8"?>
190
<configuration>
191
  <authorization>
192
    <allow roles="admin" />
193
    <deny users="*" />
194
  </authorization>
195
</configuration>
196
</com:TTextHighlighter>
197
 
198
<p>
199
Konfigurasi halaman berisi aturan otorisasi yang berlaku untuk halaman di bawah direktori <tt>protected/pages/users</tt>. Konfigurasi di atas terbaca bahwa para pengguna dalam role <tt>admin</tt> dapat mengakses semua halaman (lihat <a href="?page=Day3.Auth">BlogUser.createUser()</a> untuk mengapa harus kata "admin"). Untuk saat ini semua para pengguna lain (<tt>users="*"</tt>) ditolak untuk mengakses halaman dalam direktori ini - kecuali untuk halaman <tt>LoginUser</tt> yang seharusnya selalu bisa diakses.
200
</p>
201
 
202
<p>
203
Sekarang jika kita mengunjungi halaman <tt>NewUser</tt> sebagai seorang tamu, kita akan dialihkan ke halaman <tt>LoginUser</tt> terlebih dahulu. Jika kita masuk dengan sukses, kita akan mengalihkan kembali ke halaman<tt>NewUser</tt>.
204
</p>
205
 
206
<com:TipBox>
207
Konfigurasi halaman dapat berisi lebih dari satu aturan otorisasi. Sebagai contoh, ia dapat menyertakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modul</a> seperti yang ktia lakukan dalam <a href="?page=Day2.ConnectDB">konfigurasi aplikasi</a>. Untuk aplikasi PRADO, setiap direktori halaman dapat mempunyai konfigurasi halaman yang berlaku bagi halaman dalam direktori yang sama dan seluruh subdirektorinya.
208
</com:TipBox>
209
 
210
</com:TContent>