<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"> <com:THyperLink Text="Home" NavigateUrl="<%= $this->Service->DefaultPageUrl %>" /> <com:THyperLink Text="New Post" NavigateUrl="<%= $this->Service->constructUrl('posts.NewPost') %>" Visible="<%= !$this->User->IsGuest %>" /> <com:THyperLink Text="New User" NavigateUrl="<%= $this->Service->constructUrl('users.NewUser') %>" Visible="<%= $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"> <%@ Title="My Blog - New Post" %> <com:TContent ID="Main"> <h1>Membuat Tulisan Baru</h1> <span>Title:</span> <com:TRequiredFieldValidator ControlToValidate="TitleEdit" ErrorMessage="Please provide a title." Display="Dynamic" /> <br/> <com:TTextBox ID="TitleEdit" Columns="50" /> <br/> <span>Content:</span> <com:TRequiredFieldValidator ControlToValidate="ContentEdit" ErrorMessage="Please provide content." Display="Dynamic" /> <br/> <com:THtmlArea ID="ContentEdit" /> <br/> <com:TButton Text="Create" OnClick="createButtonClicked" /> </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>