From 888fa27278a1791dc77385bfdb60a52df54e898b Mon Sep 17 00:00:00 2001 From: kabayan <> Date: Tue, 28 Aug 2007 17:55:45 +0000 Subject: Indonesian Blog Tutorial Day 1 and Day 2 --- .../protected/layout/id/MainLayout.tpl | 2 +- .../protected/pages/Day1/id/CreateContact.page | 204 +++++++++++++++++++++ .../protected/pages/Day1/id/Setup.page | 164 +++++++++++++++++ .../protected/pages/Day1/id/ShareLayout.page | 180 ++++++++++++++++++ .../protected/pages/Day1/id/directories.gif | Bin 0 -> 3611 bytes .../protected/pages/Day1/id/directories2.gif | Bin 0 -> 4147 bytes .../protected/pages/Day1/id/directories3.gif | Bin 0 -> 3531 bytes .../protected/pages/Day1/id/output.gif | Bin 0 -> 13379 bytes .../protected/pages/Day2/id/ConnectDB.page | 46 +++++ .../protected/pages/Day2/id/CreateAR.page | 178 ++++++++++++++++++ .../protected/pages/Day2/id/CreateDB.page | 69 +++++++ demos/blog-tutorial/protected/pages/Day2/id/ER.gif | Bin 0 -> 4444 bytes .../protected/pages/Day2/id/directories.gif | Bin 0 -> 4580 bytes .../protected/pages/Day2/id/directories2.gif | Bin 0 -> 6795 bytes 14 files changed, 842 insertions(+), 1 deletion(-) create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/Setup.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories2.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/directories3.gif create mode 100644 demos/blog-tutorial/protected/pages/Day1/id/output.gif create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/ER.gif create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/directories.gif create mode 100644 demos/blog-tutorial/protected/pages/Day2/id/directories2.gif (limited to 'demos/blog-tutorial/protected') diff --git a/demos/blog-tutorial/protected/layout/id/MainLayout.tpl b/demos/blog-tutorial/protected/layout/id/MainLayout.tpl index 9f18cd46..7b3549f0 100644 --- a/demos/blog-tutorial/protected/layout/id/MainLayout.tpl +++ b/demos/blog-tutorial/protected/layout/id/MainLayout.tpl @@ -1,7 +1,7 @@ - + diff --git a/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page b/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page new file mode 100644 index 00000000..664363d0 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/CreateContact.page @@ -0,0 +1,204 @@ + + +

Membuat Halaman Kontak

+ +

+Kita telah membuat halaman standar Home.page menggunakan piranti baris perintah PRADO. Halaman relatif statis karena ia tidak berisi konten dinamis. Dalam bagian ini, kita akan membuat halaman interaktif bernama Contact. +

+ +

+Kegunaan dari halaman Contact adalah untuk mengumpulkan umpan balik dari para pengguna sistem blog kita. Untuk melaksanakan tujuan ini, kita merencanakan untuk menyajikan para pengguna dengan sebuah formulir umpan balik yang harus diisi. Dalam formulir ini, kita akan mengharuskan para pengguna untuk menyediakan namanya, alamat email, dan konten umpan balik. Setelah formulir diisi dan dikirimkan, email yang berisi umpan balik akan dikirimkan ke administrator situs. +

+ +

+Untuk membuat halaman Contact, kita memerluka dua file di bawah direktori pages: file template halaman Contact.page dan file kelas halaman Contact.php. +

+ + + + +Halaman harus berupa file template (berekstensi .page) atau file kelas, atau keduanya: +

+ +
    +
  • Hanya template-halaman yang biasanya berupa sebuah halaman sengan konten statis, seperti homepage yang sudah kita buat;
  • +
  • Hanya file kelas halaman yang menghasilkan konten murni berdasarkan eksekusi metode kelas;
  • +
  • Sebuah halaman dengan template dan kelasnya mengkombinasikan keunggulan keduanya: ia menggunakan template untuk memudahkan mengatur tata letak halaman dan menggunakan kelas untuk menyertakan logika yang menghasilkan konten dinamis.
  • +
+
+ + +

Membuat Template Halaman

+ +

+Pertama kita membuat file template untuk halaman Contact. +

+ +

+Kita menggunakan template untuk menghatur tata letak penyajian terhadap formulir umpan balik. Dalam template, kita menggunakan kotak teks untuk mengumpulkan nama pengguna, email dan umpan balik. Dan kita menggunakan validator guna memastikan bahwa pengguna menyediakan semua informasi ini sebelum mengirimkan formulir umpan balik. Seluruh template adalah sebagai berikut, +

+ + + +My Blog - Contact + +

Contact

+

Please fill out the following form to let me know your feedback on my blog. Thanks!

+ +<com:TForm> + +Your Name: +<com:TRequiredFieldValidator ControlToValidate="Name" + ErrorMessage="Please provide your name." + Display="Dynamic" /> +
+<com:TTextBox ID="Name" /> + +
+Your Email: +<com:TRequiredFieldValidator ControlToValidate="Email" + ErrorMessage="Please provide your email address." + Display="Dynamic" /> +<com:TEmailAddressValidator ControlToValidate="Email" + ErrorMessage="You entered an invalid email address." + Display="Dynamic" /> +
+<com:TTextBox ID="Email" /> + +
+Feedback: +<com:TRequiredFieldValidator ControlToValidate="Feedback" + ErrorMessage="Please provide your feedback." + Display="Dynamic" /> +
+<com:TTextBox ID="Feedback" + TextMode="MultiLine" + Rows="10" + Columns="40" /> + +
+<com:TButton Text="Submit" OnClick="submitButtonClicked" /> + +</com:TForm> + + + +
+ +

+Seperti kita lihat bahwa template terlihat sangat mirip dengan halaman HTML normal. Perbedaan utamanya adalah bahwa template berisi beberapa tag <com:>. Setap tag <com:> merujuk ke sebuah kontrol yang propertinya diinisialisasi dengan pasangan nama-nilai dalam tag. Sebagai contoh, <com:TButton> merujuk ke kontrol TButton guna menampilkan sebuah tombol di mana pengguna dapat di klik pengguna untuk mengirimkan formulir umpan balik. Untuk sintaks lengkap template, silahkan rujuk Tutorial Cepat. +

+ + +PRADO menyediakan kontrol untuk setiap tipe input HTML. Sebagai contoh, TTextBox menampilkan field input teks, TDropDownList menampilkan kotak kombo. Setiap kontrol adalah sebuah komponen yang dapat diakses dalam kode sebagai obyek dengan properti yang bisa dikonfigurasi. + + +

+Selain kontrol TTextBox, template juga menggunakan banyak kontrol validator yang memastikan input pengguna memuaskan aturan validasi spesifik. Sebagai contoh, untuk memastikan alamat email sah yang dilengkapi, kita menggunakan dua validator untuk memvalidasi kotak teks "email", seperti ditampilkan dalam kode berikut: +

+ + +Your Email: +<com:TRequiredFieldValidator + ControlToValidate="Email" + ErrorMessage="Please provide your email address." + Display="Dynamic" /> +<com:TEmailAddressValidator + ControlToValidate="Email" + ErrorMessage="You entered an invalid email address." + Display="Dynamic" /> +
+<com:TTextBox ID="Email" /> +
+
+ +

+Di bawah ini kita meringkas kontrol yang dipakai dalam template halaman: +

+ + + + +Menulis template dengan editor teks biasa dapat membosankan dan tidak intuitif untuk para desainer. Untuk memudahkan situasi ini, PRADO telah menyertakan dalam rilis ekstensi Adobe Dreamweaver yang mendukung pelengkapan-otomatis tag PRADO (misalnya menyertakan nama kontrol, nama properti, nama event, dll) dalam Dreamweaver. + + + +

Membuat Kelas Halaman

+ +

+Sekarang kita membuat kelas halaman Contact.php. Alasan kita membutuhkan kelas halaman adalah karena kita perlu merespon umpan balik yang dikirimkan oleh pengguna. + +

+Notice in the template we have the following line. The template essentially states that when a user clicks on the button, it should call the submitButtonClicked() method. Here OnClick is the name of the user click event, and the method must be defined in the page class. +

+ + + <com:TButton Text="Submit" OnClick="submitButtonClicked" /> + + +

+Selanjutnya kita menuliskan kelas halaman seperti berikut: +

+ + +IsValid) // memeriksa apakan validasi input berhasil + { + // mendapatkan nama pengguna, email, umpan balik dari kotak teks + $name = $this->Name->Text; + $email = $this->Email->Text; + $feedback = $this->Feedback->Text; + + // mengirimkan email ke administrator dengan informasi di atas + $this->mailFeedback($name, $email, $feedback); + } + } + + protected function mailFeedback($name, $email, $feedback) + { + // implementasi pengiriman email umpan balik + } +} +?> + + +

+Kode di atas sebagian besar cukup jelas. Kenyataannya, kami hanya menampilkan skema pemrograman pengendalian-event. Dalam pengendali event submitButtonClicked(), kita mengambil input pengguna. Sebagai contoh, $this->Name->Text mengembalikan nilai properti Text dari kontrol Name yang merupakan kotak teks yang mengumpulkan informasi nama pengguna. +

+ + +Nama kelas halaman harus sama seperti nama file. Ini juga persyaratan untuk penulisan komponen kelas PRADO. + + + +

Pengujian

+ +

+Contact yang baru saja kita buat dapat kita uji dengan URL http://hostname/blog/index.php?page=Contact. Jika kita mengklik pada tombol submit tanpa memasukan informasi apapun, kita akan melihat pesan kesalahan muncil di sebelah kotak teks terkait. Jika kita memasukan semua informasi yang diperlukan, metode mailFeedback() akan dipanggil. +

+ + + +

+Peningkatan berikutnya terhadap halaman ini adalah untuk menampilkan beberapa pesan konfirmasi pada halaman setelah pengguna mengirimkan umpan balik. Dan kemungkinan, browser akan dialihkan ke halaman lain jika pengiriman berhasil. Kita akan membiarkan tugas ini bagi para pembaca kita. +

+ + +Setiap validator mewakili aturan validasi. Satu kontrol input dapat dikaitkan dengan satu atau multipel validator. Validator melakukan validasi pada sisi klien dan sisi server. Pada sisi klien, yaitu browser, validasi dikerjakan dmenggunakan javascript; pada sisi server, validasi dikerjakan dengan menggunakan kode PHP. Validasi sisi-klien dapat dimatikan, sementara validasi sisi-server tidak bisa. Ini memastikan input pengguna selalu diperiksa oleh aturan validasi yang dietapkan. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/Setup.page b/demos/blog-tutorial/protected/pages/Day1/id/Setup.page new file mode 100644 index 00000000..16c8b498 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/Setup.page @@ -0,0 +1,164 @@ + + +

Persiapan Awal

+ +

+Kita mulai dengan menyiapkan direktori dan file yang diperlukan oleh kebanyakan aplikasi PRADO. Kita menggunakan piranti baris perintah PRADO untuk melaksanakan tujuan ini. +

+ +

+Anggap blog adalah nama direktori untuk menampung seluruh sistem blog, dan URL untuk mengakses folder ini adalah http://hostname/blog/ (ganti hostname dengan nama host sebenarnya). +

+ +

+Di bawah direktori blog, kita menjalankan piranti baris perintah PRADO dengan perintah berikut (ganti path/ke dengan path sebenarnya ke instalasi kerangka kerja PRADO): +

+ +php path/ke/prado-cli.php -c . + + +

+Menjalankan perintah di atas akan membuat direktori dan file berikut: +

+ + + +

+Sekarang kita mempunyai kerangka aplikasi PRADO yang dapat diakses melalui URL http://hostname/blog/index.php yang menampilkan halaman Web dengan tulisan "Welcome to PRADO". +

+ +

+Sangat bermanfaat mempelajari lebih rinci mengenai direktori dan file yang baru saja kita buat. +

+ + +

File Awal

+ +

Naskah Entri

+ +

+Setiap aplikasi PRADO mempunyai naskah entri, sering dinamakan sebagai index.php. Dalam kebanyakan kasus, ia hanya naskah PHP yang secara langsung dapat diakses oleh pengguna Web. Ini mengurangi resiko terhadap ijin para pengguna Web untuk menjalankan naskah yang tidak diinginkan pada server. +

+ +

+Kegunaan utama dari naskah entri adalah untuk mengawali aplikasi PRADO dan membiarkan ia menangani permintaan pengguna. Naskah entri biasanya berisi pernyataan PHP berikut, +

+ + +run(); +?> + + + +Nama naskah entri tidak harus index.php. Ia dapat berupa nama apa saja selama server Web dapat mengatakan bahwa naskah adalah naskah PHP 5. Sebagai contoh, pada beberapa lingkungan hosting berbagi, seseorang mungkin perlu untuk menamai naskah sebagai index.php5 agar ia bisa ditangani dengan benar oleh server the Web. + + +

Konfigurasi Aplikasi

+

+File XML opsional application.xml berisi konfigurasi aplikasi. Kegunaan utamanya adalah untuk mengkustomisasi dalam cara yang bisa mengkonfigurasi turunan aplikasi yang dibuat dalam naskah entri. Sevagai contoh, kita dapat menghidupkan fitur pencatatan untuk sistem blog kita dengan bantuan konfigurasi aplikasi. +

+ +

+File application.xml yang sekarang kita miliki hampir kosong. Sebenarnya kita dapat menghapusnya dengan aman karena aplikasi pada saat ini hanya menggunakan seting standar PRADO. Seiring kita ke depan, kita akan merujuk kembali secara kontan dan menampilkan bagaimana untuk mengkonfigurasi aplikasi kita dalam application.xml. +

+ + +

Homepage

+ +

+Homepage (juga disebut halaman standar) Home.page adalah satu-satunya halaman yang dibuat oleh piranti baris perintah PRADO. Berisi konten dalam file ini yang muncul dalam browser saat mengunjungi URL http://hostname/blog/index.php. +

+ +

+Content in the file Home.page uses the PRADO template format, which is mostly like HTML enhanced with a few PRADO-specific tags. For example, in Home.page we see the following pure HTML content: +

+ + + + + Welcome to PRADO + + +

Welcome to PRADO!

+ + +
+ + +

Direktori Awal

+ +

Direktori protected

+ +

+Direktori protected, juga dikenal sebagai path basis aplikasi, adalah direktori akar yang menampung halaman, template, konfigurasi, data, dll. Nama protected menunjukan bahwa direktori ini harus disembunyikan dari para pengguna Web, karena file di bawah direktori ini berisi data sensitif. +

+ +

+Server Web berbeda mempunyai berbeda terhadap "melindungi" direktori. Untuk sever httpd Apache, cara termudah adalah untuk menempatkan file bernama .htaccess di bawah direktori dengan isi deny from all. +

+ + +

Direktori protected/runtime dan assets

+ +

+Direktori protected/runtime dan assets adalah dua direktori yang harus disetel bisa ditulisi oleh proses server Web. Direktori runtime menyimpan data sensitif (misalnya konfigurasi aplikasi yang diuraikan) yang dibuat saat menjalankan aplikasi PRADO, karena direktori assets menyimpan sumber daya yang dipublikasikan (misalnya file gambar, file javascript). +

+ + +Aman untuk menghapus file dan direktori di bawah protected/runtime dan assets. Sebenarnya para pengembang direkomendasikan untuk melakukan pekerjaan pembersihan ini ketika mereka memutakhirkan instalasi PRADO. + + + +

Direktori pages

+ +

+Direktori pages adalah akar direktori halaman yang menampung seluruh halaman dalam sebuah aplikasi PRADO. Ini mirip analogi terhadap direktori htdocs pada server Web httpd Apache. +

+ +

+Kita sudah melihat bagaimana cara mengakses homepage. Untuk mengakses halaman yang ditempatkan di bawah pages, menggunakan URL http://hostname/blog/index.php?page=path.ke.NamaHalaman. Berdasarkan URL ini, PRADO akan melihar halaman bernama NamaHalaman di bawah direktori pages/path/ke. URL yang kita pakai untuk mengakses homepage sebelumnya sama dengan http://hostname/blog/index.php?page=Home. +

+ + +

Kustomisasi

+ +

+Dimungkinkan untuk mengkustomisasi nama dan lokasi terhadap file dan direktori yang dijelaskan di atas. +

+ +

+Sebagai contoh, untuk meningkatkan keamanan, seseorang mungkin ingin memindahkan seluruh direktori protected ke tempat lain yang bukan folder Web. Untuk melakukannya, gunakan pernyataan PHP berikut untuk membuat turunan aplikasi dalam naskah entri: +

+ + +$application = new TApplication( 'path/ke/protected' ); + + +

+Untuk membuat lokasi akar direktori halaman dan mengubah nama homepage, seseorang dapat menetapkannya dalam konfigurasi aplikasi application.xml sebagai berikut: +

+ + + + + + + + + + +

+Setelah anda mempelajari lebih jauh mengenai PRADO, anda akan melihat bahwa PRADO adalah kerangka kerja fleksibel yang membolehkan anda untuk mengkustomisasi hampir setiap aspeknya. Kami akan menjelaskan lebih lanjut teknik kustomisasi setelah kita melanjutkan tutorial kita. +

+ +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page b/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page new file mode 100644 index 00000000..d505beed --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day1/id/ShareLayout.page @@ -0,0 +1,180 @@ + + +

Berbagi Tata Letak Umum

+ +

+Dalam bagian ini, kita akan menggunakan fitur master/content PRADO untuk membagi tata letak umum diantara halaman. Tata letak merujuk ke area yang sama atay sebagian besar sama untuk setelan halaman. Sebagai contoh, dalam sistem blog kita, semua halaman akan berbagi header yang sama, footer dan bar-samping yang berisi link jalan pintas. Implementasi langsung adalah untuk mengulang tata letak umum dalam setiap halaman. Akan tetapi, pendekatan ini adalah cenderung salah dan sulit untuk dipelihara. Fitur master/content membolehkan kita untuk menggunakan tata letak umum sebagai sebuah kontrol yang memusatkan logika dan penyajian tata letak umum untuk setiap halaman. +

+ + +Ini juga memungkinkan untuk membagi tata letak umum melalui penyertaan template, yang mirip inklusi file PHP. Akibat dari penyertaan inklusi template ini adalah bahwa ia tidak berdiri sendiri dan tidak membawa kelas untuk mengisi logika untuk tata letak umum. + + + +

Membuat Kontrol Master

+ +

+Sekarang kita membuat kontrol master MainLayout untuk mewakili tata letak umum berbagi dengan halaman blog kita. Kontrol MainLayout adalah kontrol template yang diperluas dari TTemplateControl. Ini mememerlukan file template MainLayout.tpl dan sebuah file kelas MainLayout.php yang ditempatkan di bawah direktori yang sama. Guna menjembatani pemeliharaan, kita membuat direktori baru protected/layouts untuk menampungnya. +

+ + + +

+Untuk saat ini, MainLayout hanya berisi header dan footer sederhana, seperti ditampilkan berikut ini. Kedepan, kita akan menambahkan bar-samping. Para pembaca juga disarankan untuk meningkatkan tata letak dengan fitur yang lainnya. +

+ + + +<com:THead /> + +<com:TForm> +
+ + + +
+<com:TContentPlaceHolder ID="Main" /> +
+ + + +
+</com:TForm> + + +
+ +

+Contoh di atas memperlihatkan konten dalam file template MainLayout.tpl. Tiga tag baru ini dipakai: +

+ + +

+File kelas MainLayout.php sangat sederhana: +

+ + + + + + +Nama ekstensi file untuk template halaman .page, sementara untuk template non-halaman yaitu .tpl. Ini untuk membedakan halaman dari kontrol lain. Keduanya menggunakan sintaks template yang sama. Untuk halaman, file kelasnya adalah opsional (standarnya TPage), sementara untuk kontrol non-halaman, file kelasnya adalah mandatori. Mirip dengan Java, nama file kelas harus sama seperti nama kelas. Harap berhati-hati mengenai sensitifitas-huruf pada sistem Linux/Unix. + + + +

Menggunakan Kontrol Master

+

+Untuk menggunakan kontrol master yang baru saja dibuat, kita akan memodifikasi Home.page dan Contact.page. Dalam keadaan tertentu, kita perlu untuk menghapus header dan footer darinya karena kontrol master akan bertanggung jawab untuk menampilkannya; dan kita perlu memberitahu dua halaman di mana mereka harus menggunakan MainLayout sebagai masternya. +

+ +

+Kode berikut memperlihatkan konten dalam Contact.page setelah perubahan: +

+ + +<%@ MasterClass="Application.layouts.MainLayout" Title="My Blog - Contact" %> + +<com:TContent ID="Main"> + +

Contact

+

Please fill out the following form to let me know your feedback on my blog. Thanks!

+ +...kotak teks dan validator untuk nama pengguna... + +...kotak teks dan validator untuk emali pengguna... + +...kotak teks dan validator untuk konten umpan balik... + +<com:TButton Text="Submit" OnClick="submitButtonClicked" /> + +</com:TContent> +
+ +

+Konten yang dikurung di dalam tag <com:TContent> tag akan disisipkan ke dalam tempat yang disiapkan oleh <com:TContentPlaceHolder> pada template master. +

+ + +Dimungkinkan untuk memiliki multipel TContentPlaceHolder dalam sebuah template master dan multipel TContent dakan tenokate konten. Mereka saling dipasangkan dengan nilai ID-nya. Juga dimungkinkan untuk membuat template konten menjadi master template konten lainnya dengan menempatkan TContentPlaceHolder di pembentuk. Ini disebut master berulang. + + +

+Selain <com:TContent>, kita juga melihat tag baru lain <%@ %> di atas, yang disebut tag kontrol template. Ia berisi pasangan nama-nilai yang dipakai untuk menginisialisasi properti terkait bagi pemilik template, yaitu, halaman Contact. +

+ +

+Dengan menyetel properti MasterClass sebagai Application.layouts.MainLayout, kita menginstruksikan halaman Contact untuk menggunakan MainLayout sebagai masternya. Di sini, kita sedang menggunakan format namespace untuk merujuk ke kelas MainLayout. +

+ + +Format namespace sebagian besar dipakai dalam pemrograman PRADO. Dipakai bersama dengan alias path. PRADO mendefinisikan dua alias path: System merujuk ke direktori framework pada instalasi PRADO, dan Application merujuk ke direktori protected. Namespace Application.layouts.MainLayout selanjutnya bisa diterjemahkan sebagai protected/layouts/MainLayout yang tepatnya adalah nama file (tanpa ekstensi .php) untuk kelas MainLayout. + + + +

Cara Alternatif Menetapkan Master

+ +

+Ada beberapa cara tambahan untuk menetapkan kelas master untuk sebuah halaman. +

+ +

+Kita dapat menetapkan master dalam kode seperti berikut untuk menghidupkan perubahan dinamis terhadap tata letak: +

+ + +MasterClass='Path.To.NewLayout'; + } + + // ... +} +?> + + +

+Dalam contoh di atas, kita menetapkan MasterClass dalam metode onPreInit() yang diturunkan dari TPage. Metode dipanggil oleh PRADO langsung setelah turunan halaman dibuat. Selanjutnya kita dapat menentukan secara dinamis tata letak yang dipakai saat halaman diminta. Sebagai contoh, ketika halaman yang diminta oleh pengguna terdaftar kita memakai tata letak A, dan tata letak B dipakai jika pengguna tamu yang meminta halaman. +

+ +

+Kita juga dapat menetapkan master dalam konfigurasi aplikasi atau konfigurasi halaman. Kode berikut memperlihatkan konfigurasi aplikasi yang dimutakhirkan untuk sistem blog kita: +

+ + + + + + + + + + + + + + +

+Dengan melakukan demikian, kita menghindari kesulitan pada penetapan master dalam setiap template halaman. Jika kita memutuskan untuk menggunakan master yang berbeda untuk halaman, kita hanya perlu mengubah konfigurasi aplikasi. Untuk alasan ini, dalam sistem blog kita, kita akan menggunakan pendekatan untuk menetapkan master. +

+ + +Ada urutan yang menentukan master yang mana yang sebenarnya diterapkan ketika ia ditetapkan dalam tempat multipel. Dalam keadaan tertentu, onPreInit() diambil lebih dulu di atas template halaman di atas konfigurasi aplikasi/halaman. Oleh karena itu, jika kita menetapkan MainLayout dalam konfigurasi aplikasi/halaman dan kita menetapkan SpecialLayout dalam Contact.page, master yang efektif adalah yang terakhir. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories.gif new file mode 100644 index 00000000..884e15bc Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif new file mode 100644 index 00000000..edf264d0 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories2.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif b/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif new file mode 100644 index 00000000..3451935f Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/directories3.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day1/id/output.gif b/demos/blog-tutorial/protected/pages/Day1/id/output.gif new file mode 100644 index 00000000..9ad2bfb8 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day1/id/output.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page new file mode 100644 index 00000000..7d535293 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page @@ -0,0 +1,46 @@ + + +

Melakukan Koneksi DB

+ +

+Untuk menggunakan database yang baru saja kita buat, pertama kita perlu melaksanakan koneksinya. +

+ +

+Kita akan menggunakan Data Access Objects (DAO) untuk memisahkan mekanisme akses data kita. Jika nanti kita menggunakan DBMS yang berbeda (misalnya PostgreSQL, Oracle) untuk menyimpan data blog, kita hanya perlu mengubah nama sumber database atau data source nama (DSN) dam kita dapat menjaga kode PHP kita tetap utuh. +

+ + +Untuk menggunakan DAO, anda harus menginstalasi dan menghidupkan ekstensi PDO PHP dan driver PDO spesifik-database (dalam kasus kita, itu adalah driver SQLite PDO). Ini bisa dilakukan secara mudah pada Windows dengan mengubah file php.ini, menambahkan baris berikut: + +extension=php_pdo.dll +extension=php_pdo_sqlite.dll + + + +

+Selanjutnya untuk memisahkan tabel database sebenarnya, kita juga akan menggunakan fitur Rekaman Aktif (AR). Setiap rekaman data akan disajikan sebagai obyek Rekaman Aktif yang mampu melakukan query, menyimpan dan menghapus tanpa menulis pernyataan SQL. +

+ +

+Kita memodifikasi file konfigurasi aplikasi kita protected/application.xml dengan menyisipkan baris berikut, yang memberitahu Rekaman Aktif bagaimana untuk menghubungkan ke database yang baru saja kita buat: +

+ + + + + + + + + + +

+Konfigurasi di atas memperlihatkan bahwa kita menambahkan dua modul pada aplikasi kita. Modul TDataSourceConfig dikonfigurasi dengan string koneksi sqlite:protected/data/blog.db yang mengarah ke SQLite database kita. Koneksi ini dipakai oleh modul TActiveRecordConfig yang dibutuhkan leh Rekaman Aktif. +

+ + +Seseorang dapat menyiapkan dua atau lebih koneksi DB dalam konfigurasi aplikasi. Untuk lebih jelasnya, lihat DOkumentasi Rekaman Aktif. Dan tentunya, seseorang juga bisa secara eksplisit membuat koneksi DB dalam kode PHP menggunakan komponen TDbConnection dalam PDO. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page new file mode 100644 index 00000000..533825c6 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page @@ -0,0 +1,178 @@ + + +

Membuat Kelas Rekaman Aktif

+ +

+Kita perlu membuat dua kelas Rekaman Aktif, UserRecord dan PostRecord, masing-masing untuk mewakili rekaman data dalam tabel users dan posts. Kelas Rekaman Aktif harus diperluas dari kelas basis ActiveRecord, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait. +

+ +

+Untuk mengatur lebih baik direktori, kita membuat direktori baru protected/database guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori protected/database ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya. +

+ + + + + + + +

+Daripada menulis kelas secara manual, kita akan menggunakan piranti baris perintah PRADO lagi untuk membuat kelas bagi kita. +

+ +

+Di bawah direktori blog, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah: +

+ + +php path/ke/prado-cli.php shell . + + +

+Kita akan melihat +

+ + +Command line tools for Prado 3.1.0. +** Loaded PRADO appplication in directory "protected". +PHP-Shell - Version 0.3.1 +(c) 2006, Jan Kneschke + +>> use '?' to open the inline help + +>> + + +

+Pada prompt, masukkan dua perintah berikut untuk membuat kelas UserRecord dan PostRecord: +

+ + +>> generate users Application.database.UserRecord + +>> generate posts Application.database.PostRecord + + +

+Di sini kita menggunakan format namespace lagi untuk menetapkan kelas yang dibuat. Path Application.database.UserRecord menunjukan bahwa kita ingin file kelas UserRecord menjadi protected/database/UserRecord.php. +

+ +

+Kita akan melihat struktur direktori berikut dengan dua file baru di bawah protected/database: +

+ + + +

+Jika kita memeriksa file kelas PostRecord , kita akan melihat konten berikut. +

+ + +class PostRecord extends TActiveRecord +{ + const TABLE='posts'; + public $post_id; + public $author_id; + public $create_time; + public $title; + public $content; + public $status; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} + + +

+Seperti kita lihat, untuk setiap field dalam tabel posts, kelas mempunyai anggota data terkait. Konstan TABLE menetapkan nama tabel untuk PostRecord. Metode statis finder() membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek PostRecord. +

+ +

+Kita dapat menggunakan piranti baris perintah untuk melakukan beberapa pengujian dengan kelas Rekaman Aktif yang baru saja kita buat. Masih dalam mode interaktif pada piranti baris perintah, kita memasukan pernyataan PHP dan seharusnya melihat kode berikut. Para pembaca yang tertarik dapat mencoba pernyataan PHP laninnya, seperti misalnya UserRecord::finder()->findAll(). +

+ + +>> PostRecord::finder()->findAll() +array +( + [0] => PostRecord#1 + ( + [post_id] => '1' + [author_id] => 'admin' + [create_time] => '1175708482' + [title] => 'first post' + [content] => 'this is my first post' + [status] => '0' + [TActiveRecord:_readOnly] => false + [TActiveRecord:_connection] => null + [TComponent:_e] => array() + ) +) + + +

Hubungan Antara Tulisan dan Pengguna

+

+Mengingat bahwa ada hubungan kunci asing antara tabel users dan posts. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan. +

+ + + +

+Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel posts berisi field bernama author_id. Field author_id ini adalah kunci asing yang mereferensi tabel users. Dalam keadaan tertentu, nilai dalam field author_id seharusnya dari tabel users field username. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan". +

+ +

+Kita dapat membuat model hubungan antara tabel posts dan users dalam Rekaman Aktif dengan memodifikasi kelas PostRecord dan UserRecord seperti berikut. +

+ + +class PostRecord extends TActiveRecord +{ + //... properti dan metode seperti seblumnya + + public $author; //menampung array UserRecord + + protected static $RELATIONS=array + ( + 'author' => array(self::BELONGS_TO, 'UserRecord'), + ); +} + + +

+Properti statis $RELATIONS pada PostRecord mendefinisikan bahwa properti $author dimiliki UserRecord. Dalam array(self::BELONGS_TO, 'UserRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini UserRecord. UserRecord didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak PostRecord. +

+ + +class UserRecord extends TActiveRecord +{ + //... properti dan metode seperti seblumnya + + public $posts=array(); //menampung array PostRecord + + protected static $RELATIONS=array + ( + 'posts' => array(self::HAS_MANY, 'PostRecord'), + ); +} + + +

+Sebuah array UserRecord dengan dan tulisan terkaitnya dapat diambil seperti berikut. +

+ + +$users = UserRecord::finder()->withPosts()->findAll(); + + + +Metode withXXX() (di mana XXX adalah nama properti hubungan, dalam hal ini, Posts) mengambil PostRecords terkait menggunakan query kedua (tidak dengan menggunakan join). Metode withXXX() menerima argumen yang sama sebagai finder lain dari TActiveRecord, misalhnya withPosts('status = ?', 0). + + +

+Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart Rekaman Aktif. +

+ +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page new file mode 100644 index 00000000..30868268 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page @@ -0,0 +1,69 @@ + + +

Membuat Database

+ +

+Banyak aplikasi Web menggunakan database untuk memelihara datanya. Sistem blog kita tidak terkecuali. Dalam bagian ini, kami akan menjelaskan bagaimana untuk menulis halaman kendali-database untuk sistem blog kita. Kita akan menggunakan teknik termasuk database access object (DAO) dan Rekaman Aktif. +

+ +

+Untuk keperluan tutorial, kita menyederhanakan kebutuhan sistem blog kita agar hanya perlu berhadapan dengan pengguna dan data tulisan. Selanjutnya kita membuat dua tabel database, users dan posts, seperti diperlihatkan dalam duagram hubungan entitas atau entity-relationship (ER) di bawah ini. +

+ + + +

+Kita menggunakan SQLite 3 database untuk menyimpan data kita. Pertama kita ubah diagram ER ke dalam pernyataan SQL berikut dan menyimpannya dalam file protected/schema.sql. +

+ + +/* buat tabel pengguna */ +CREATE TABLE users ( + username VARCHAR(128) NOT NULL PRIMARY KEY, + email VARCHAR(128) NOT NULL, + password VARCHAR(128) NOT NULL, /* dalam teks biasa */ + role INTEGER NOT NULL, /* 0: pengguna normal, 1: administrator */ + first_name VARCHAR(128), + last_name VARCHAR(128) +); + +/* buat tabel tulisan */ +CREATE TABLE posts ( + post_id INTEGER NOT NULL PRIMARY KEY, + author_id VARCHAR(128) NOT NULL + CONSTRAINT fk_author REFERENCES users(username), + create_time INTEGER NOT NULL, /* cap waktu UNIX */ + title VARCHAR(256) NOT NULL, /* judul tulisan */ + content TEXT, /* badan tulisan */ + status INTEGER NOT NULL /* 0: diterbitkan; 1: draft; 2: ditunda; 2: ditolak */ +); + +/* sisipkan beberapa rekaman data awal untuk pengujian */ +INSERT INTO users VALUES ('admin', 'admin@example.com', 'demo', 1, 'Qiang', 'Xue'); +INSERT INTO users VALUES ('demo', 'demo@example.com', 'demo', 0, 'Wei', 'Zhuo'); +INSERT INTO posts VALUES (NULL, 'admin', 1175708482, 'first post', 'this is my first post', 0); + + + +Batasan fk_author diabaikan oleh SQLite karena tidak mendukung batasan kunci asing. Meskipun demikian, kita masih memelihara batasan di sana untuk kemampuan pemindahan sistem blog kita ke DBMS yang berbeda. Juga, dalam contoh di atas kita mengeksploitasi bukti bahwa field posts.post_id adalah auto-incremental jika kita menempatkan NULL untuk nilainya. + + +

+Kemudian kita menggunakan piranti baris perintah SQLite untuk membuat SQLite database. Kita membuat sebuah direktori protected/data untuk menampung file database SQLite. Sekarang kita menjalankan perintah berikut di bawah direktori protected/data: +

+ + +sqlite3 blog.db < ../schema.sql + + +

+Database sudah dibuat sebagai protected/data/blog.db dan kita akan melihat direktori dan file berikut: +

+ + + + +SQLite memerlukan direktori protected/data dan file database protected/data/blog.db keduanya disetel agar bisa ditulisi oleh proses server Web. + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/id/ER.gif b/demos/blog-tutorial/protected/pages/Day2/id/ER.gif new file mode 100644 index 00000000..7a5397b3 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/id/ER.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day2/id/directories.gif b/demos/blog-tutorial/protected/pages/Day2/id/directories.gif new file mode 100644 index 00000000..797ef932 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/id/directories.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif new file mode 100644 index 00000000..b053b4c6 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif differ -- cgit v1.2.3