summaryrefslogtreecommitdiff
path: root/demos/blog-tutorial
diff options
context:
space:
mode:
authorxue <>2007-04-06 03:06:36 +0000
committerxue <>2007-04-06 03:06:36 +0000
commit05c6a7a2ef0d6be3a02b8e1a3e2bd2b6afacf799 (patch)
treeee00c40f3be3b9de95d139ccfb51330ffbfea05b /demos/blog-tutorial
parent16bbf435c8048c3c726de78adc8a670b8a527229 (diff)
Finished blog tutorial day 2.
Diffstat (limited to 'demos/blog-tutorial')
-rw-r--r--demos/blog-tutorial/protected/common/TopicList.tpl18
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/ConnectDB.page2
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/CreateAR.page78
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/CreateDB.page6
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/directories2.gifbin0 -> 6795 bytes
-rw-r--r--demos/blog-tutorial/samples/day2/blog/index.php23
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/.htaccess1
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/application.xml44
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/data/blog.dbbin0 -> 5120 bytes
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/database/PostRecord.php25
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/database/UserRecord.php27
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.php7
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/layouts/MainLayout.tpl20
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.page47
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/pages/Contact.php30
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/pages/Home.page7
-rw-r--r--demos/blog-tutorial/samples/day2/blog/protected/schema.sql23
17 files changed, 350 insertions, 8 deletions
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 @@
</div>
<div class="topic">
-<div>Day 2: Using Database</div>
+<div>Day 2: Working with Database - Part I</div>
<ul>
<li><a href="?page=Day2.CreateDB">Creating Database</a></li>
<li><a href="?page=Day2.ConnectDB">Establishing DB Connection</a></li>
- <li><a href="?page=Day2.CreateDAO">Creating DAOs</a></li>
+ <li><a href="?page=Day2.CreateAR">Creating AR Classes</a></li>
+</ul>
+</div>
+
+<div class="topic">
+<div>Day 3: Working with Database - Part II</div>
+<ul>
<li><a href="?page=">Creating NewPost Page</a></li>
<li><a href="?page=">Creating ListPost Page</a></li>
</ul>
</div>
<div class="topic">
-<div>Day 3: Authentication and Authorization</div>
+<div>Day 4: Authentication and Authorization</div>
<ul>
<li><a href="?page=">Creating Login Page</a></li>
<li><a href="?page=">Using PRADO Auth Framework</a></li>
@@ -38,13 +44,13 @@
</div>
<div class="topic">
-<div>Day 4: Developing and Using Components</div>
+<div>Day 5: Developing and Using Components</div>
<ul>
</ul>
</div>
<div class="topic">
-<div>Day 5: Customization and Refactoring</div>
+<div>Day 6: Customization and Refactoring</div>
<ul>
<li><a href="?page=">Using Themes and Skins</a></li>
<li><a href="?page=">Customizing Error Handling</a></li>
@@ -53,7 +59,7 @@
</div>
<div class="topic">
-<div>Day 6: Performance Tuneup and Deployment</div>
+<div>Day 7: Performance Tuneup and Deployment</div>
<ul>
<li><a href="?page=">Caching</a></li>
</ul>
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
</com:NoteBox>
<p>
-To further reduce the dependency on the actual database tables, we will also use the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> 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 <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> (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.
</p>
<p>
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 @@
+<com:TContent ID="Main">
+
+<h1>Creating Active Record Classes</h1>
+
+<p>
+We need to create two <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> classes, <tt>UserRecord</tt> and <tt>PostRecord</tt>, to represent data records in the <tt>users</tt> and <tt>posts</tt> tables, respectively. Active Record classes must extend from the base class <tt>ActiveRecord</tt>, and their properties must match exactly to the fields of the corresponding tables. To better organize our directories, we create a new directory <tt>protected/database</tt> to hold the class files.
+</p>
+
+<p>
+Instead of writing the classes manually, we will use the <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">PRADO command line tool</a> again to generate the classes for us.
+</p>
+
+<p>
+Under the <tt>blog</tt> directory, run the following command to enter into the interactive mode of the command line tool:
+</p>
+
+<com:TTextHighlighter CssClass="source">
+php path/to/prado-cli.php shell .
+</com:TTextHighlighter>
+
+<p>
+We should see
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="text">
+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>
+At the prompt, enter the following two commands to create <tt>UserRecord</tt> and <tt>PostRecord</tt> classes:
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="text">
+>> generate users Application.database.UserRecord
+
+>> generate posts Application.database.PostRecord
+</com:TTextHighlighter>
+
+<p>
+Here we used the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again to specify the classes to be created. The path <tt>Application.database.UserRecord</tt> indicates that we want the <tt>UserRecord</tt> class file to be <tt>protected/database/UserRecord.php</tt>.
+</p>
+
+<p>
+We should see the following directory structure with two new files under <tt>protected/database</tt>:
+</p>
+
+<img src="<%~ directories2.gif %>" />
+
+<p>
+If we check the <tt>UserRecord</tt> class file, we should see the following content. As we see, for each field in the <tt>users</tt> table, the class has a corresponding data member. The constant <tt>TABLE</tt> specifies the table name for the <tt>UserRecord</tt>. The static method <tt>finder()</tt> allows us to perform query and retrieve users data in terms of <tt>UserRecord</tt> objects, as we will see in later sections.
+</p>
+
+<com:TTextHighlighter CssClass="source" Language="php">
+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);
+ }
+}
+</com:TTextHighlighter>
+
+</com:TContent> \ 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 <a href="http://www.sqlite.org/omitted.html">foreign key
</com:NoteBox>
<p>
-We use the <a href="http://www.sqlite.org/download.html">SQLite command line tool</a> to create the SQLite database. We first create a directory <tt>protected/data</tt> 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 <tt>protected/data</tt>:
+We then use the <a href="http://www.sqlite.org/download.html">SQLite command line tool</a> to create the SQLite database. We create a directory <tt>protected/data</tt> to hold the SQLite database file. We now execute the following command under the directory <tt>protected/data</tt>:
</p>
<com:TTextHighlighter CssClass="source">
@@ -60,4 +60,8 @@ The database has been created as <tt>protected/data/blog.db</tt> and we shall se
<img src="<%~ directories.gif %>" />
+<com:NoteBox>
+It is required by SQLite that both the directory <tt>protected/data</tt> and the database file <tt>protected/data/blog.db</tt> be set writable by the Web server process.
+</com:NoteBox>
+
</com:TContent> \ 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
--- /dev/null
+++ b/demos/blog-tutorial/protected/pages/Day2/directories2.gif
Binary files 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 @@
+<?php
+
+$frameworkPath='D:\wwwroot\prado3\framework\prado.php';
+
+// The following directory checks may be removed if performance is required
+$basePath=dirname(__FILE__);
+$assetsPath=$basePath.'/assets';
+$runtimePath=$basePath.'/protected/runtime';
+
+if(!is_file($frameworkPath))
+ die("Unable to find prado framework path $frameworkPath.");
+if(!is_writable($assetsPath))
+ die("Please make sure that the directory $assetsPath is writable by Web server process.");
+if(!is_writable($runtimePath))
+ die("Please make sure that the directory $runtimePath is writable by Web server process.");
+
+
+require_once($frameworkPath);
+
+$application=new TApplication;
+$application->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 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<application id="blog" mode="Debug">
+ <!-- alias definitions and namespace usings
+ <paths>
+ <alias id="myalias" path="./lib" />
+ <using namespace="Application.common.*" />
+ </paths>
+ -->
+
+ <!-- configurations for modules -->
+ <modules>
+ <!-- Remove this comment mark to enable caching
+ <module id="cache" class="System.Caching.TDbCache" />
+ -->
+
+ <!-- Remove this comment mark to enable PATH url format
+ <module id="request" class="THttpRequest" UrlFormat="Path" />
+ -->
+
+ <!-- Remove this comment mark to enable logging
+ <module id="log" class="System.Util.TLogRouter">
+ <route class="TBrowserLogRoute" Categories="System" />
+ </module>
+ -->
+ <module id="data" class="System.Data.ActiveRecord.TActiveRecordConfig">
+ <database ConnectionString="sqlite:protected/data/blog.db" />
+ </module>
+ </modules>
+
+ <!-- configuration for available services -->
+ <services>
+ <service id="page" class="TPageService" DefaultPage="Home">
+ <pages MasterClass="Application.layouts.MainLayout" />
+ </service>
+ </services>
+
+ <!-- application parameters
+ <parameters>
+ <parameter id="param1" value="value1" />
+ <parameter id="param2" value="value2" />
+ </parameters>
+ -->
+</application> \ 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
--- /dev/null
+++ b/demos/blog-tutorial/samples/day2/blog/protected/data/blog.db
Binary files 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 @@
+<?php
+/**
+ * Auto generated by prado-cli.php on 2007-04-05 10:25:19.
+ */
+class PostRecord extends TActiveRecord
+{
+ const TABLE='posts';
+
+ public $post_id;
+
+ public $author;
+
+ public $create_time;
+
+ public $title;
+
+ public $content;
+
+
+ public static function finder($className=__CLASS__)
+ {
+ return parent::finder($className);
+ }
+}
+?> \ 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 @@
+<?php
+/**
+ * Auto generated by prado-cli.php on 2007-04-05 10:23:57.
+ */
+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/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 @@
+<?php
+
+class MainLayout extends TTemplateControl
+{
+}
+
+?> \ 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 @@
+<html>
+<com:THead />
+<body>
+<com:TForm>
+
+<div id="header">
+<h1>My PRADO Blog</h1>
+</div>
+
+<div id="main">
+<com:TContentPlaceHolder ID="Main" />
+</div>
+
+<div id="footer">
+Powered by <%= PRADO::poweredByPrado() %>
+</div>
+
+</com:TForm>
+</body>
+</html> \ 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" %>
+
+<com:TContent ID="Main">
+
+<h1>Contact</h1>
+<p>Please fill out the following form to let me know your feedback on my blog. Thanks!</p>
+
+<span>Your Name:</span>
+<com:TRequiredFieldValidator ControlToValidate="Name"
+ ErrorMessage="Please provide your name."
+ Display="Dynamic"
+ />
+<br/>
+<com:TTextBox ID="Name" />
+
+<br/>
+
+<span>Your Email:</span>
+<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"
+ />
+<br/>
+<com:TTextBox ID="Email" />
+
+<br/>
+
+<span>Feedback:</span>
+<com:TRequiredFieldValidator ControlToValidate="Feedback"
+ ErrorMessage="Please provide your feedback."
+ Display="Dynamic"
+ />
+<br/>
+<com:TTextBox ID="Feedback"
+ TextMode="MultiLine"
+ Rows="10"
+ Columns="40" />
+
+<br/>
+
+<com:TButton Text="Submit" OnClick="submitButtonClicked" />
+
+</com:TContent> \ 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 @@
+<?php
+
+class Contact extends TPage
+{
+ /**
+ * Event handler for the OnClick event of the submit button.
+ * @param TButton the button triggering the event
+ * @param TEventParameter event parameter (null here)
+ */
+ public function submitButtonClicked($sender, $param)
+ {
+ if ($this->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" %>
+
+<com:TContent ID="Main">
+
+<h1>Welcome to PRADO!</h1>
+
+</com:TContent> \ 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');