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/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 6 files changed, 293 insertions(+) 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/pages/Day2') 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