From 05c6a7a2ef0d6be3a02b8e1a3e2bd2b6afacf799 Mon Sep 17 00:00:00 2001 From: xue <> Date: Fri, 6 Apr 2007 03:06:36 +0000 Subject: Finished blog tutorial day 2. --- demos/blog-tutorial/protected/common/TopicList.tpl | 18 +++-- .../protected/pages/Day2/ConnectDB.page | 2 +- .../protected/pages/Day2/CreateAR.page | 78 +++++++++++++++++++++ .../protected/pages/Day2/CreateDB.page | 6 +- .../protected/pages/Day2/directories2.gif | Bin 0 -> 6795 bytes demos/blog-tutorial/samples/day2/blog/index.php | 23 ++++++ .../samples/day2/blog/protected/.htaccess | 1 + .../samples/day2/blog/protected/application.xml | 44 ++++++++++++ .../samples/day2/blog/protected/data/blog.db | Bin 0 -> 5120 bytes .../day2/blog/protected/database/PostRecord.php | 25 +++++++ .../day2/blog/protected/database/UserRecord.php | 27 +++++++ .../day2/blog/protected/layouts/MainLayout.php | 7 ++ .../day2/blog/protected/layouts/MainLayout.tpl | 20 ++++++ .../samples/day2/blog/protected/pages/Contact.page | 47 +++++++++++++ .../samples/day2/blog/protected/pages/Contact.php | 30 ++++++++ .../samples/day2/blog/protected/pages/Home.page | 7 ++ .../samples/day2/blog/protected/schema.sql | 23 ++++++ 17 files changed, 350 insertions(+), 8 deletions(-) create mode 100644 demos/blog-tutorial/protected/pages/Day2/CreateAR.page create mode 100644 demos/blog-tutorial/protected/pages/Day2/directories2.gif create mode 100644 demos/blog-tutorial/samples/day2/blog/index.php create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/.htaccess create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/application.xml create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/data/blog.db create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/database/PostRecord.php create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/database/UserRecord.php create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.php create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.tpl create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.page create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.php create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/pages/Home.page create mode 100644 demos/blog-tutorial/samples/day2/blog/protected/schema.sql (limited to 'demos') diff --git a/demos/blog-tutorial/protected/common/TopicList.tpl b/demos/blog-tutorial/protected/common/TopicList.tpl index 555b0efe..b6174985 100644 --- a/demos/blog-tutorial/protected/common/TopicList.tpl +++ b/demos/blog-tutorial/protected/common/TopicList.tpl @@ -18,18 +18,24 @@
-
Day 2: Using Database
+
Day 2: Working with Database - Part I
+
+ +
+
Day 3: Working with Database - Part II
+
-
Day 3: Authentication and Authorization
+
Day 4: Authentication and Authorization
-
Day 4: Developing and Using Components
+
Day 5: Developing and Using Components
-
Day 5: Customization and Refactoring
+
Day 6: Customization and Refactoring
-
Day 6: Performance Tuneup and Deployment
+
Day 7: Performance Tuneup and Deployment
diff --git a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page index 232ceb98..90db11ef 100644 --- a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page +++ b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page @@ -19,7 +19,7 @@ extension=php_pdo_sqlite.dll

-To further reduce the dependency on the actual database tables, we will also use the Active Record feature which is based on PDO. Each data record will be represented as an Active Record object, which saves us from writing repetitive SQL statements. +To further abstract the actual database tables, we will also use the Active Record (AR) feature. Each data record will be represented as an Active Record object which is capable of performing query, saving and deletion without writing SQL statements.

diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page new file mode 100644 index 00000000..bf2c05aa --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page @@ -0,0 +1,78 @@ + + +

Creating Active Record Classes

+ +

+We need to create two Active Record classes, UserRecord and PostRecord, to represent data records in the users and posts tables, respectively. Active Record classes must extend from the base class ActiveRecord, and their properties must match exactly to the fields of the corresponding tables. To better organize our directories, we create a new directory protected/database to hold the class files. +

+ +

+Instead of writing the classes manually, we will use the PRADO command line tool again to generate the classes for us. +

+ +

+Under the blog directory, run the following command to enter into the interactive mode of the command line tool: +

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

+We should see +

+ + +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 + +>> + + +

+At the prompt, enter the following two commands to create UserRecord and PostRecord classes: +

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

+Here we used the namespace format again to specify the classes to be created. The path Application.database.UserRecord indicates that we want the UserRecord class file to be protected/database/UserRecord.php. +

+ +

+We should see the following directory structure with two new files under protected/database: +

+ + + +

+If we check the UserRecord class file, we should see the following content. As we see, for each field in the users table, the class has a corresponding data member. The constant TABLE specifies the table name for the UserRecord. The static method finder() allows us to perform query and retrieve users data in terms of UserRecord objects, as we will see in later sections. +

+ + +class UserRecord extends TActiveRecord +{ + const TABLE='users'; + public $username; + public $email; + public $password; + public $role; + public $first_name; + public $last_name; + + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } +} + + + \ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/CreateDB.page index 0d45ba50..291b20e4 100644 --- a/demos/blog-tutorial/protected/pages/Day2/CreateDB.page +++ b/demos/blog-tutorial/protected/pages/Day2/CreateDB.page @@ -47,7 +47,7 @@ SQLite does not support foreign key

-We use the SQLite command line tool to create the SQLite database. We first create a directory protected/data to hold the SQLite database file. Per SQLite's requirement, this directory and the database file to be created must be set writable by the Web server process. We now execute the following command under the directory protected/data: +We then use the SQLite command line tool to create the SQLite database. We create a directory protected/data to hold the SQLite database file. We now execute the following command under the directory protected/data:

@@ -60,4 +60,8 @@ The database has been created as protected/data/blog.db and we shall se + +It is required by SQLite that both the directory protected/data and the database file protected/data/blog.db be set writable by the Web server process. + + \ No newline at end of file diff --git a/demos/blog-tutorial/protected/pages/Day2/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/directories2.gif new file mode 100644 index 00000000..b053b4c6 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/directories2.gif differ diff --git a/demos/blog-tutorial/samples/day2/blog/index.php b/demos/blog-tutorial/samples/day2/blog/index.php new file mode 100644 index 00000000..8132899e --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/index.php @@ -0,0 +1,23 @@ +run(); + +?> \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/.htaccess b/demos/blog-tutorial/samples/day2/blog/protected/.htaccess new file mode 100644 index 00000000..3418e55a --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/application.xml b/demos/blog-tutorial/samples/day2/blog/protected/application.xml new file mode 100644 index 00000000..69cdbf9f --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/application.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/data/blog.db b/demos/blog-tutorial/samples/day2/blog/protected/data/blog.db new file mode 100644 index 00000000..37449fd3 Binary files /dev/null and b/demos/blog-tutorial/samples/day2/blog/protected/data/blog.db differ diff --git a/demos/blog-tutorial/samples/day2/blog/protected/database/PostRecord.php b/demos/blog-tutorial/samples/day2/blog/protected/database/PostRecord.php new file mode 100644 index 00000000..a9fb5db3 --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/database/PostRecord.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/database/UserRecord.php b/demos/blog-tutorial/samples/day2/blog/protected/database/UserRecord.php new file mode 100644 index 00000000..5f2be169 --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/database/UserRecord.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.php b/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.php new file mode 100644 index 00000000..253d6c03 --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.tpl b/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.tpl new file mode 100644 index 00000000..5218b98d --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.tpl @@ -0,0 +1,20 @@ + + + + + + + +
+ +
+ + + +
+ + \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.page b/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.page new file mode 100644 index 00000000..c36149ca --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.page @@ -0,0 +1,47 @@ +<%@ Title="My Blog - Contact" %> + + + +

Contact

+

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

+ +Your Name: + +
+ + +
+ +Your Email: + + +
+ + +
+ +Feedback: + +
+ + +
+ + + +
\ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.php b/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.php new file mode 100644 index 00000000..b6ce575e --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.php @@ -0,0 +1,30 @@ +IsValid) // check if input validation is successful + { + // obtain the user name, email, feedback from the textboxes + $name = $this->Name->Text; + $email = $this->Email->Text; + $feedback = $this->Feedback->Text; + + // send an email to administrator with the above information + $this->mailFeedback($name, $email, $feedback); + } + } + + protected function mailFeedback($name, $email, $feedback) + { + // implementation of sending the feedback email + } +} + +?> \ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/pages/Home.page b/demos/blog-tutorial/samples/day2/blog/protected/pages/Home.page new file mode 100644 index 00000000..7a9c4a7d --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/pages/Home.page @@ -0,0 +1,7 @@ +<%@ Title="Welcome to PRADO" %> + + + +

Welcome to PRADO!

+ +
\ No newline at end of file diff --git a/demos/blog-tutorial/samples/day2/blog/protected/schema.sql b/demos/blog-tutorial/samples/day2/blog/protected/schema.sql new file mode 100644 index 00000000..085e47c3 --- /dev/null +++ b/demos/blog-tutorial/samples/day2/blog/protected/schema.sql @@ -0,0 +1,23 @@ +/* create users table */ +CREATE TABLE users ( + username VARCHAR(128) NOT NULL PRIMARY KEY, + email VARCHAR(128) NOT NULL UNIQUE, + password VARCHAR(128) NOT NULL, /* plain text password */ + role INTEGER NOT NULL, /* 0: normal user, 1: administrator */ + first_name VARCHAR(128), + last_name VARCHAR(128) +); + +/* create posts table */ +CREATE TABLE posts ( + post_id INTEGER NOT NULL PRIMARY KEY, + author VARCHAR(128) NOT NULL, /* references users.username */ + create_time INTEGER NOT NULL, /* UNIX timestamp */ + title VARCHAR(256) NOT NULL, /* title of the post */ + content TEXT NOT NULL /* content of the post */ +); + +/* insert some initial data records for testing */ +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'); -- cgit v1.2.3