summaryrefslogtreecommitdiff
path: root/demos/blog-tutorial/protected/pages/Day4/id/CreateNewPost.page
blob: 31aba2bbc55889c579f16d1acfeed56c19462e56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<com:TContent ID="Main">

<h1>Membuat Halaman <tt>NewPost</tt></h1>

<p>
Halaman <tt>NewPost</tt> disediakan untuk mengotentikasi pengguna untuk pembuatan tulisan blog baru. Ia perlu untuk menampilkan formulir yang mengumpulkan informasi mengenai tulisan baru, termasuk judul tulisan dan konten badan tulisan.
</p>

<p>
Karena <tt>NewPost</tt> hanya bisa diakses oleh pengguna terotentikasi, kita menambahkan file konfigurasi <tt>config.xml</tt> di bawah direktori <tt>protected/pages/posts</tt>. Konfigurasi menetapkan bahwa para pengguna tidak bisa mengakses <tt>NewPost</tt> dan <tt>EditPost</tt> yang akan diperkenalkan dalam bagian berikutnya. Semua pengguna lainnya hanya memiliki akses ke <tt>ListPost</tt> dan <tt>ReadPost</tt>
</p>

<com:TTextHighlighter CssClass="source" Language="xml">
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <authorization>
    <deny pages="NewPost,EditPost" users="?" />
    <allow pages="ListPost,ReadPost" />
    <deny users="*" />
  </authorization>
</configuration>
</com:TTextHighlighter>

<com:TipBox>
Selalu menjadi ide yang baik untuk memulai dengan <tt>deny="*"</tt> yang menampung semua aturan dari bawah dan secara bertahap memberikan akses ke halaman dengan aturan tambahan.
</com:TipBox>

<p>
Karena jumlah halaman kita berkembang, kita ingin memodifikasi  <tt>MainLayout</tt> agar dalam footer pada halaman blog kita ada link ke berbagai halaman, termasuk homepage, halaman <a href="?page=Day3.CreateNewUser">NewUser</a> (hanya terlihat oleh administrator), dan halaman <tt>NewPost</tt> mendatang (hanya terlihat oleh pengguna terotentikasi).
</p>

<com:TTextHighlighter CssClass="source" Language="prado">
<div id="footer">
&lt;com:THyperLink Text="Home"
	NavigateUrl="&lt;%= $this->Service->DefaultPageUrl %>" />

&lt;com:THyperLink Text="New Post"
	NavigateUrl="&lt;%= $this->Service->constructUrl('posts.NewPost') %>"
	Visible="&lt;%= !$this->User->IsGuest %>" />

&lt;com:THyperLink Text="New User"
	NavigateUrl="&lt;%= $this->Service->constructUrl('users.NewUser') %>"
	Visible="&lt;%= $this->User->IsAdmin %>" />
...other links...
</div>
</com:TTextHighlighter>

<p>
Sekarang kita membuat dua file <tt>protected/pages/posts/NewPost.page</tt> dan <tt>protected/pages/posts/NewPost.php</tt> masing-masing untuk menyimpan template halaman dan kelas halaman.
</p>

<h2>Membuat Template Halaman</h2>
<p>
Template halaman <tt>NewPost</tt> berisi <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.TextBox">TTextBox</a> untuk mengumpulkan judul tulisan dan <a href="http://www.pradosoft.com/demos/quickstart/?page=Controls.HtmlArea">THtmlArea</a> untuk mengumpulkan konten tulisan. Yang terakhir adalah editor HTML WYSIWYG. Guna memastikan bahwa input pengguna sudah benar, kita mengaitkan validator dengan kontrol input ini.
</p>

<com:TTextHighlighter CssClass="source" Language="prado">
&lt;%@ Title="My Blog - New Post" %>

&lt;com:TContent ID="Main">

<h1>Membuat Tulisan Baru</h1>

<span>Title:</span>
&lt;com:TRequiredFieldValidator
	ControlToValidate="TitleEdit"
	ErrorMessage="Please provide a title."
	Display="Dynamic" />
<br/>
&lt;com:TTextBox ID="TitleEdit" Columns="50" />

<br/>
<span>Content:</span>
&lt;com:TRequiredFieldValidator
	ControlToValidate="ContentEdit"
	ErrorMessage="Please provide content."
	Display="Dynamic" />
<br/>
&lt;com:THtmlArea ID="ContentEdit" />

<br/>
&lt;com:TButton Text="Create" OnClick="createButtonClicked" />

&lt;/com:TContent>
</com:TTextHighlighter>


<h2>Membuat Kelas Halaman</h2>

<p>
Dari template halaman di atas, kita melihat bahwa sebagian besar kita perlu menulis sebuah kelas halaman yang mengimplementasikan pengendali event: <tt>createButtonClicked()</tt> (ditempelkan ke tombo <tt>Create</tt> dalam event <tt>OnClick</tt>).
</p>

<com:TTextHighlighter CssClass="source" Language="php">
class NewPost extends TPage
{
	/**
	 * Membuat tulisan baru jika semua input benar.
	 * Metode ini merespon event OnClick pada tombol "create".
	 * @param mixed event sender
	 * @param mixed event parameter
	 */
	public function createButtonClicked($sender,$param)
	{
		if($this->IsValid)  // bila semua validasi sukses
		{
			// populasikan obyek PostRecord dengan input pengguna
			$postRecord=new PostRecord;
			// menggunakan SafeText datipada Text guna menghindari serangan Penaskahan Situs Silang
			$postRecord->title=$this->TitleEdit->SafeText;
			$postRecord->content=$this->ContentEdit->SafeText;
			$postRecord->author_id=$this->User->Name;
			$postRecord->create_time=time();
			$postRecord->status=0;

			// simpan ke database lewat mekanisme Rekaman Aktif
			$postRecord->save();

			// alihkan browser ke halaman tulisan yang baru dibuat
			$url=$this->Service->constructUrl('posts.ReadPost',array('id'=>$postRecord->post_id));
			$this->Response->redirect($url);
		}
	}
}
</com:TTextHighlighter>

<h2>Pengujian</h2>
<p>
Untuk menguji halaman <tt>NewPost</tt>, masuk lebih dulu dan klik pada link tombol <tt>New Post</tt> dalam footer pada homepage. Browser kita akan menampilkan hasil berikut dengan URL <tt>http://hostname/blog/index.php?page=NewPost</tt>.
</p>

<com:InfoBox>
Ketika Anda mengunjungi halaman <tt>NewPost</tt> untuk pertama kali, Anda bisa melihat bahwa diperlukan beberapa detik sebelum halaman ditampilkan. Ini dikarenakan PRADO perlu mengurai dan mempublikasikan kode javascript dan gambar untuk kontrol <tt>THtmlArea</tt> yang dipakai dalam halaman. Ini dikerjakan sekali dan untuk semuanya.
</com:InfoBox>

<com:TipBox>
Untuk menguji fitur lembaran yang kita kembangkan untuk halaman <a href="?page=Day4.CreateListPost">ListPost</a>, kita dapat membuat lima atau lebih tulisan dan melihat apa yang terjadi pada homepage. Lembar dalam <tt>ListPost</tt> menampilkan lima tulisan setiap halamannya.
</com:TipBox>

<img src="<%~ output3.gif %>" class="output" />

</com:TContent>