summaryrefslogtreecommitdiff
path: root/demos/blog-tutorial/protected/pages/Day2/id
diff options
context:
space:
mode:
authorkabayan <>2007-08-28 17:55:45 +0000
committerkabayan <>2007-08-28 17:55:45 +0000
commit888fa27278a1791dc77385bfdb60a52df54e898b (patch)
tree97964c94b7810c58291a47f2a8b43558c7102810 /demos/blog-tutorial/protected/pages/Day2/id
parent60785e1670360529b968471c39232b5193772f15 (diff)
Indonesian Blog Tutorial Day 1 and Day 2
Diffstat (limited to 'demos/blog-tutorial/protected/pages/Day2/id')
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page46
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page178
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page69
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/ER.gifbin0 -> 4444 bytes
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/directories.gifbin0 -> 4580 bytes
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/id/directories2.gifbin0 -> 6795 bytes
6 files changed, 293 insertions, 0 deletions
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 @@
+<com:TContent ID="Main">
+
+<h1>Melakukan Koneksi DB</h1>
+
+<p>
+Untuk menggunakan database yang baru saja kita buat, pertama kita perlu melaksanakan koneksinya.
+</p>
+
+<p>
+Kita akan menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> 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.
+</p>
+
+<com:NoteBox>
+Untuk menggunakan DAO, anda harus menginstalasi dan menghidupkan <a href="http://www.php.net/manual/en/ref.pdo.php">ekstensi PDO PHP</a> <i>dan</i> driver PDO spesifik-database (dalam kasus kita, itu adalah driver SQLite PDO). Ini bisa dilakukan secara mudah pada Windows dengan mengubah file <tt>php.ini</tt>, menambahkan baris berikut:
+<com:TTextHighlighter CssClass="source">
+extension=php_pdo.dll
+extension=php_pdo_sqlite.dll
+</com:TTextHighlighter>
+</com:NoteBox>
+
+<p>
+Selanjutnya untuk memisahkan tabel database sebenarnya, kita juga akan menggunakan fitur <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a> (AR). Setiap rekaman data akan disajikan sebagai obyek Rekaman Aktif yang mampu melakukan query, menyimpan dan menghapus tanpa menulis pernyataan SQL.
+</p>
+
+<p>
+Kita memodifikasi file konfigurasi aplikasi kita <tt>protected/application.xml</tt> dengan menyisipkan baris berikut, yang memberitahu Rekaman Aktif bagaimana untuk menghubungkan ke database yang baru saja kita buat:
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="xml">
+<modules>
+ <module id="db" class="System.Data.TDataSourceConfig">
+ <database ConnectionString="sqlite:protected/data/blog.db" />
+ </module>
+ <module class="System.Data.ActiveRecord.TActiveRecordConfig" ConnectionID="db" />
+</modules>
+</com:TTextHighlighter>
+
+<p>
+Konfigurasi di atas memperlihatkan bahwa kita menambahkan dua <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modul</a> pada aplikasi kita. Modul <tt>TDataSourceConfig</tt> dikonfigurasi dengan string koneksi <tt>sqlite:protected/data/blog.db</tt> yang mengarah ke SQLite database kita. Koneksi ini dipakai oleh modul <tt>TActiveRecordConfig</tt> yang dibutuhkan leh Rekaman Aktif.
+</p>
+
+<com:InfoBox>
+Seseorang dapat menyiapkan dua atau lebih koneksi DB dalam konfigurasi aplikasi. Untuk lebih jelasnya, lihat <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">DOkumentasi Rekaman Aktif</a>. Dan tentunya, seseorang juga bisa secara eksplisit membuat koneksi DB dalam kode PHP menggunakan komponen <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a> dalam PDO.
+</com:InfoBox>
+
+</com:TContent> \ 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 @@
+<com:TContent ID="Main">
+
+<h1>Membuat Kelas Rekaman Aktif</h1>
+
+<p>
+Kita perlu membuat dua kelas <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>, <tt>UserRecord</tt> dan <tt>PostRecord</tt>, masing-masing untuk mewakili rekaman data dalam tabel <tt>users</tt> dan <tt>posts</tt>. Kelas Rekaman Aktif harus diperluas dari kelas basis <tt>ActiveRecord</tt>, dan harus mendefinisikan nama properti yang sama dengan nama field dari tabel terkait.
+</p>
+
+<p>
+Untuk mengatur lebih baik direktori, kita membuat direktori baru <tt>protected/database</tt> guna menampung file kelas. Kita juga memodifikasi konfigurasi aplikasi kita dengan menyisipkan baris berikut. Ini sama dengan menambahkan direktori <tt>protected/database</tt> ke PHP include_path, yang membolehkan kita untuk menggunakan kelas tanpa secara eksplisit menyertakannya.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="xml">
+<paths>
+ <using namespace="Application.database.*" />
+</paths>
+</com:TTextHighlighter>
+
+<p>
+Daripada menulis kelas secara manual, kita akan menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">piranti baris perintah PRADO</a> lagi untuk membuat kelas bagi kita.
+</p>
+
+<p>
+Di bawah direktori <tt>blog</tt>, jalankan perintah berikut untuk masuk ke dalam mode interaktif pada piranti baris perintah:
+</p>
+
+<com:TTextHighlighter CssClass="source cli">
+php path/ke/prado-cli.php shell .
+</com:TTextHighlighter>
+
+<p>
+Kita akan melihat
+</p>
+
+<com:TTextHighlighter CssClass="source cli">
+Command line tools for Prado 3.1.0.
+** Loaded PRADO appplication in directory "protected".
+PHP-Shell - Version 0.3.1
+(c) 2006, Jan Kneschke <jan@kneschke.de>
+
+>> use '?' to open the inline help
+
+>>
+</com:TTextHighlighter>
+
+<p>
+Pada prompt, masukkan dua perintah berikut untuk membuat kelas <tt>UserRecord</tt> dan <tt>PostRecord</tt>:
+</p>
+
+<com:TTextHighlighter CssClass="source cli">
+>> generate users Application.database.UserRecord
+
+>> generate posts Application.database.PostRecord
+</com:TTextHighlighter>
+
+<p>
+Di sini kita menggunakan <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">format namespace</a> lagi untuk menetapkan kelas yang dibuat. Path <tt>Application.database.UserRecord</tt> menunjukan bahwa kita ingin file kelas <tt>UserRecord</tt> menjadi <tt>protected/database/UserRecord.php</tt>.
+</p>
+
+<p>
+Kita akan melihat struktur direktori berikut dengan dua file baru di bawah <tt>protected/database</tt>:
+</p>
+
+<img src="<%~ directories2.gif %>" class="output" />
+
+<p>
+Jika kita memeriksa file kelas <tt>PostRecord</tt> , kita akan melihat konten berikut.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+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);
+ }
+}
+</com:TTextHighlighter>
+
+<p>
+Seperti kita lihat, untuk setiap field dalam tabel <tt>posts</tt>, kelas mempunyai anggota data terkait. Konstan <tt>TABLE</tt> menetapkan nama tabel untuk <tt>PostRecord</tt>. Metode statis <tt>finder()</tt> membolehkan kita melakukan query dan mengambil data tulisan dalam batasan obyek <tt>PostRecord</tt>.
+</p>
+
+<p>
+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 <tt>UserRecord::finder()->findAll()</tt>.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+>> 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()
+ )
+)
+</com:TTextHighlighter>
+
+<h1>Hubungan Antara Tulisan dan Pengguna</h1>
+<p>
+Mengingat bahwa ada hubungan kunci asing antara tabel <tt>users</tt> dan <tt>posts</tt>. Diagram hubungan-entitas ditampilkan di bawah ini demi kenyamanan.
+</p>
+
+<img src="<%~ ER.gif %>" class="output" />
+
+<p>
+Dari diagram hubungan-entitas di atas, kita merlihat bahwa tabel <tt>posts</tt> berisi field bernama <tt>author_id</tt>. Field <tt>author_id</tt> ini adalah kunci asing yang mereferensi tabel <tt>users</tt>. Dalam keadaan tertentu, nilai dalam field <tt>author_id</tt> seharusnya dari tabel <tt>users</tt> field <tt>username</tt>. Salah satu konsekuensi dari hubungan ini, dalam pola pikir obyek, adalah bahwa setiap "tulisan" milik "author" dan satu "author" dapat memiliki banyak "tulisan".
+</p>
+
+<p>
+Kita dapat membuat model hubungan antara tabel <tt>posts</tt> dan <tt>users</tt> dalam Rekaman Aktif dengan memodifikasi kelas <tt>PostRecord</tt> dan <tt>UserRecord</tt> seperti berikut.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+class PostRecord extends TActiveRecord
+{
+ //... properti dan metode seperti seblumnya
+
+ public $author; //menampung array UserRecord
+
+ protected static $RELATIONS=array
+ (
+ 'author' => array(self::BELONGS_TO, 'UserRecord'),
+ );
+}
+</com:TTextHighlighter>
+
+<p>
+Properti statis <tt>$RELATIONS</tt> pada <tt>PostRecord</tt> mendefinisikan bahwa properti <tt>$author</tt> dimiliki <tt>UserRecord</tt>. Dalam <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, elemen pertama mendefinisikan tipe hubungan, dalam hal ini <tt>self::BELONGS_TO</tt>. Elemen kedua adalah nama pada rekaman terkait, dalam hal ini <tt>UserRecord</tt>. <tt>UserRecord</tt> didefinisikan sama di bawah ini, perbedaannya yaitu rekaman pengguna mempunyai banyak <tt>PostRecord</tt>.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+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'),
+ );
+}
+</com:TTextHighlighter>
+
+<p>
+Sebuah array <tt>UserRecord</tt> dengan dan tulisan terkaitnya dapat diambil seperti berikut.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+$users = UserRecord::finder()->withPosts()->findAll();
+</com:TTextHighlighter>
+
+<com:TipBox>
+Metode <tt>withXXX()</tt> (di mana XXX adalah nama properti hubungan, dalam hal ini, <tt>Posts</tt>) mengambil <tt>PostRecords</tt> terkait menggunakan query kedua (tidak dengan menggunakan join). Metode <tt>withXXX()</tt> menerima argumen yang sama sebagai finder lain dari TActiveRecord, misalhnya <tt>withPosts('status = ?', 0)</tt>.
+</com:TipBox>
+
+<p>
+Dokumentasi lengkap selanjutnya dapat ditemukan dalam dokumen quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
+</p>
+
+</com:TContent> \ 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 @@
+<com:TContent ID="Main">
+
+<h1>Membuat Database</h1>
+
+<p>
+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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> dan <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Rekaman Aktif</a>.
+</p>
+
+<p>
+Untuk keperluan tutorial, kita menyederhanakan kebutuhan sistem blog kita agar hanya perlu berhadapan dengan pengguna dan data tulisan. Selanjutnya kita membuat dua tabel database, <tt>users</tt> dan <tt>posts</tt>, seperti diperlihatkan dalam duagram hubungan entitas atau entity-relationship (ER) di bawah ini.
+</p>
+
+<img src="<%~ ER.gif %>" class="output" />
+
+<p>
+Kita menggunakan SQLite 3 database untuk menyimpan data kita. Pertama kita ubah diagram ER ke dalam pernyataan SQL berikut dan menyimpannya dalam file <tt>protected/schema.sql</tt>.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="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);
+</com:TTextHighlighter>
+
+<com:NoteBox>
+Batasan <tt>fk_author</tt> diabaikan oleh SQLite karena tidak mendukung <a href="http://www.sqlite.org/omitted.html">batasan kunci asing</a>. 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 <tt>posts.post_id</tt> adalah <a href="http://www.sqlite.org/autoinc.html">auto-incremental</a> jika kita menempatkan NULL untuk nilainya.
+</com:NoteBox>
+
+<p>
+Kemudian kita menggunakan <a href="http://www.sqlite.org/download.html">piranti baris perintah SQLite</a> untuk membuat SQLite database. Kita membuat sebuah direktori <tt>protected/data</tt> untuk menampung file database SQLite. Sekarang kita menjalankan perintah berikut di bawah direktori <tt>protected/data</tt>:
+</p>
+
+<com:TTextHighlighter CssClass="source cli">
+sqlite3 blog.db < ../schema.sql
+</com:TTextHighlighter>
+
+<p>
+Database sudah dibuat sebagai <tt>protected/data/blog.db</tt> dan kita akan melihat direktori dan file berikut:
+</p>
+
+<img src="<%~ directories.gif %>" class="output" />
+
+<com:NoteBox>
+SQLite memerlukan direktori <tt>protected/data</tt> dan file database <tt>protected/data/blog.db</tt> keduanya disetel agar bisa ditulisi oleh proses server Web.
+</com:NoteBox>
+
+</com:TContent> \ 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
--- /dev/null
+++ b/demos/blog-tutorial/protected/pages/Day2/id/ER.gif
Binary files 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
--- /dev/null
+++ b/demos/blog-tutorial/protected/pages/Day2/id/directories.gif
Binary files 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
--- /dev/null
+++ b/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif
Binary files differ