summaryrefslogtreecommitdiff
path: root/demos/blog-tutorial/protected/pages/Day2
diff options
context:
space:
mode:
Diffstat (limited to 'demos/blog-tutorial/protected/pages/Day2')
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/ConnectDB.page8
-rw-r--r--demos/blog-tutorial/protected/pages/Day2/CreateAR.page6
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/CreateDB.page2
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page47
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page177
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page70
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/ER.gifbin4444 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/ER.vsdbin73216 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/directories.gifbin4580 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/fr/directories2.gifbin6795 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page46
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/CreateAR.page178
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/CreateDB.page69
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/ER.gifbin4444 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/directories.gifbin4580 -> 0 bytes
-rwxr-xr-xdemos/blog-tutorial/protected/pages/Day2/id/directories2.gifbin6795 -> 0 bytes
16 files changed, 8 insertions, 595 deletions
diff --git a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page
index 1d036577..2f1119a4 100755
--- a/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page
+++ b/demos/blog-tutorial/protected/pages/Day2/ConnectDB.page
@@ -7,7 +7,7 @@ To use the database that we just created, we first need to establish a connectio
</p>
<p>
-We are going to use <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> to abstract our data access mechanisms. If in future we decide to use a different DBMS (e.g. PostgreSQL, Oracle) to store our blog data, we only need to change the database source name (DSN) and we can keep our PHP code intact.
+We are going to use <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> to abstract our data access mechanisms. If in future we decide to use a different DBMS (e.g. PostgreSQL, Oracle) to store our blog data, we only need to change the database source name (DSN) and we can keep our PHP code intact.
</p>
<com:NoteBox>
@@ -19,7 +19,7 @@ extension=php_pdo_sqlite.dll
</com:NoteBox>
<p>
-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.
+To further abstract the actual database tables, we will also use the <a href="http://www.pradoframework.net/site/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>
@@ -36,11 +36,11 @@ We modify our application configuration file <tt>protected/application.xml</tt>
</com:TTextHighlighter>
<p>
-The configuration above shows that we are adding two <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modules</a> to our application. The <tt>TDataSourceConfig</tt> module is configured with the connection string <tt>sqlite:protected/data/blog.db</tt> which points to our SQLite database. This connection is used by the <tt>TActiveRecordConfig</tt> module which is required by Active Record.
+The configuration above shows that we are adding two <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Modules">modules</a> to our application. The <tt>TDataSourceConfig</tt> module is configured with the connection string <tt>sqlite:protected/data/blog.db</tt> which points to our SQLite database. This connection is used by the <tt>TActiveRecordConfig</tt> module which is required by Active Record.
</p>
<com:InfoBox>
-One may set up two or more DB connections in the application configuration. For more details, see the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record documentation</a>. And of course, one may also explicitly create a DB connection in PHP code using the <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a> component in PDO.
+One may set up two or more DB connections in the application configuration. For more details, see the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record documentation</a>. And of course, one may also explicitly create a DB connection in PHP code using the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">TDbConnection</a> component in PDO.
</com:InfoBox>
</com:TContent> \ No newline at end of file
diff --git a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page
index 0cf28bdd..26355122 100644
--- a/demos/blog-tutorial/protected/pages/Day2/CreateAR.page
+++ b/demos/blog-tutorial/protected/pages/Day2/CreateAR.page
@@ -3,7 +3,7 @@
<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 must define property names that matches with the field names of the corresponding table.
+We need to create two <a href="http://www.pradoframework.net/site/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 must define property names that matches with the field names of the corresponding table.
</p>
<p>
@@ -47,7 +47,7 @@ So we need to modify again our application configuration in the services section
<img src="<%~blog_wsat_generate_ar.png%>" style="width: 700px;" />
<p>
- In the <tt>Output Folder</tt> field we used the <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder.
+ In the <tt>Output Folder</tt> field we used the <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Fundamentals.Components">namespace format</a> again, the path <tt>Application.database</tt> indicates that we want to put our class's files in the <tt>protected/database/</tt> folder.
The <tt>*</tt> in the <tt>Table Name</tt> field means that we want to generate all AR classes, you can specify a table name instead if you want to generate just a specific AR class.
</p>
@@ -121,7 +121,7 @@ The method <tt>withXXX()</tt> (where XXX is the relationship property name, in t
</com:TipBox>
<p>
-Further detailed documentation can be found in the quickstart <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs.
+Further detailed documentation can be found in the quickstart <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> docs.
</p>
</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 1f7085d7..c3494091 100755
--- a/demos/blog-tutorial/protected/pages/Day2/CreateDB.page
+++ b/demos/blog-tutorial/protected/pages/Day2/CreateDB.page
@@ -3,7 +3,7 @@
<h1>Creating Database</h1>
<p>
-Most Web applications use database to keep data. Our blog system is not an exception. In this section, we will describe how to write database-driven pages for our blog system. We will use techniques including <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> and <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
+Most Web applications use database to keep data. Our blog system is not an exception. In this section, we will describe how to write database-driven pages for our blog system. We will use techniques including <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> and <a href="http://www.pradoframework.net/site/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
</p>
<p>
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page
deleted file mode 100755
index bc817c92..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page
+++ /dev/null
@@ -1,47 +0,0 @@
-<com:TContent ID="Main">
-
-<h1>Connexion à la base</h1>
-
-
-<p>
-Pour pouvoir utiliser la base de données que nous venons de créer, nous devons tout d'abord établir une connexion.
-</p>
-
-<p>
-Nous allons utiliser <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">Data Access Objects (DAO)</a> pour établir une couche d'abstraction. Si dans le futur nous décidions d'utiliser un autre SGBD (ie: PostgreSQl, Oracle, ...), il nous suffirait de modifier la chaine de connexion (DSN) et nous pourrions conserver notre code PHP intact.
-</p>
-
-<com:NoteBox>
-Pour utiliser DAO, nous devons installer et activer la librairie <a href="http://www.php.net/manual/en/ref.pdo.php">PHP PDO extension</a> <i>ainsi que</i> un driver PDO d'accès aux données (dans notre cas, c'est le driver PDO SQLite). Ceci peut être fait facilement sous Windows en incluant dans le fichier <tt>php.ini</tt> les lignes suivantes:
-<com:TTextHighlighter CssClass="source">
-extension=php_pdo.dll
-extension=php_pdo_sqlite.dll
-</com:TTextHighlighter>
-</com:NoteBox>
-
-<p>
-Pour une meilleure abstraction de notre base de données, nous utilisons aussi la fonctionnalité <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a> (AR). Chaque enregistrement est ainsi représenté par un objet qui a la possibilité d'exécuter des requêtes, de mettre à jour les données, de les supprimer et ceci sans écrire la moindre commande SQL.
-</p>
-
-<p>
-Nous modifions notre fichier de configuration de l'application <tt>protected/application.xml</tt> en insérant les lignes suivantes, qui indiquent à <tt>Active Record</tt> comment se connecter à notre base de données.
-</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>
-Dans la configuration précédente, nous avons ajouté deux <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Modules">modules</a> à notre application. Le module <tt>TDataSourceConfig</tt> est configuré avec la chaine de connexion <tt>sqlite:protected/data/blog.db</tt> qui pointe vers notre base de données. Cette connexion est utilisée par le module <tt>TActiveRecordConfig</tt> qui est requis pour l'utilisation d'Active Record.
-</p>
-
-<com:InfoBox>
-Il est tout à fait possible de définir plusieurs connexion de base de données dans notre fichier de configuration. Pour plus de détails, veuillez vous référer à la <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">documentation Active Record</a>. Il est, de même possible, d'établir une connexion à une base de données en utilisant du code PHP au travers du composant <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">TDbConnection</a>.
-</com:InfoBox>
-
-</com:TContent> \ No newline at end of file
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page b/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page
deleted file mode 100755
index 1c5aae7b..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page
+++ /dev/null
@@ -1,177 +0,0 @@
-<com:TContent ID="Main">
-
-<h1>Création des classes Active Record</h1>
-
-<p>
-Nous avons besoin de définir deux classes <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>, <tt>UserRecord</tt> et <tt>PostRecord</tt>, qui représentent respectivement les tables <tt>users</tt> et <tt>posts</tt>. Les classes Active Record doivent hériter de la classe <tt>ActiveRecord</tt>, et doivent définir les propriétés qui correspondent aux champs de la table correspondante.
-</p>
-
-<p>
-Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier <tt>protected/database</tt> qui contiendra nos deux classes. Nous modifions notre fichier de configuration de l'application en y insérant les lignes suivantes. Ceci est équivalent à inclure le dossier <tt>protected/database</tt> à notre chemin d'inclusion de PHP (<tt>include_path</tt>). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="xml">
-<paths>
- <using namespace="Application.database.*" />
-</paths>
-</com:TTextHighlighter>
-
-<p>
-Au lieu de créer nos classes manuellement, nous allons utiliser les <a href="http://www.pradosoft.com/demos/quickstart/?page=GettingStarted.CommandLine">outils en ligne de commande de PRADO</a> pour qu'il nous génère les classes.
-</p>
-
-<p>
-Dans le dossier <tt>blog</tt>, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande:
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
-php path/to/prado-cli.php shell .
-</com:TTextHighlighter>
-
-<p>
-Vous devriez voir
-</p>
-
-<com:TTextHighlighter CssClass="source cli" 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>
-A l'invite de commande, entrer les deux commandes suivantes pour créer les classes <tt>UserRecord</tt> et <tt>PostRecord</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
->> generate users Application.database.UserRecord
-
->> generate posts Application.database.PostRecord
-</com:TTextHighlighter>
-
-<p>
-Ici, nous avons utilisés les <a href="http://www.pradosoft.com/demos/quickstart/?page=Fundamentals.Components">espaces de noms</a> pour indiquer où les classes seront créées. Le chemin <tt>Application.database.UserRecord</tt> indique que nous désirons que la classe soit insérée dans <tt>protected/database/UserRecord.php</tt>.
-</p>
-
-<p>
-Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier <tt>protected/database</tt>:
-</p>
-
-<img src="<%~ directories2.gif %>" class="output" />
-
-<p>
-Si vous consultez le fichier <tt>PostRecord</tt>, vous devriez voir le contenu suivant:
-</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>
-Comme vous pouvez le constater, pour chaque champs de la table <tt>posts</tt>, la classe déclare un membre correspondant. La constante <tt>TABLE</tt> indique le nom de la table que gère la classe <tt>PostRecord</tt>. La méthode statique <tt>finder()</tt> permet d'effectuer des requêtes et de lire les données sous forme d'objets <tt>PostRecord</tt>.
-</p>
-<p>
-Vous pouvez utiliser l'outil en ligne de commande pour tester nos nouvelles classes. En restant dans le mode interactif de l'outil en ligne de commande, vous pouvez saisir les commandes PHP et voir ce qui suit. Vous pouvez tester des commandes telles que <tt>UserRecord::finder()->findAll()</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli" Language="text">
->> 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>Relations entre Posts et Users</h1>
-<p>
-Rappellez-vous qu'il y a une relation entre les tables <tt>users</tt> et <tt>posts</tt>. Le diagramme des relations est indiqué ci-après.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-A partir de ce diagramme, nous voyons que la table <tt>posts</tt> contient un champ <tt>author_id</tt>. Le champ <tt>author_id</tt> est une clé étrangère qui référence la table <tt>users</tt>. En particulier, les valeurs du champ <tt>author_id</tt> doivent apparaitre dans dans le champ <tt>username</tt> de la table <tt>users</tt>. Une des conséquences de cette relation, en réfléchissant orienté objet, est que chaque "post" repose sur un "author" et qu'un "author" peut avoir plusieurs "posts".
-</p>
-
-<p>
-Nous pouvons modéliser les relations entre <tt>posts</tt> and <tt>users</tt> dans nos classes <tt>PostRecord</tt> and <tt>UserRecord</tt> en les modifiant comme ci-dessous :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class PostRecord extends TActiveRecord
-{
- //... propriétés et méthodes comme précédemment
-
- public $author; //contient un objet UserRecord
-
- public static $RELATIONS=array
- (
- 'author' => array(self::BELONGS_TO, 'UserRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-La propriété statique <tt>$RELATIONS</tt> de la classe <tt>PostRecord</tt> définit que la propriété <tt>$author</tt> fait référence à un <tt>UserRecord</tt>. Dans le tableau : <tt>array(self::BELONGS_TO, 'UserRecord')</tt>, le premier élément défini le type de relation, dans notre cas, <tt>self::BELONGS_TO</tt>. Le deuxième élément est le nom de l'objet en relation, dans notre cas <tt>UserRecord</tt>. La classe <tt>UserRecord</tt> est définie comme ci-dessous, la différence est que chaque objet <tt>UserRecord</tt> contient plusieurs <tt>PostRecord</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-class UserRecord extends TActiveRecord
-{
- //... propriétés et méthodes comme précédemment
-
- public $posts=array(); //contient un tableau de PostRecord
-
- public static $RELATIONS=array
- (
- 'posts' => array(self::HAS_MANY, 'PostRecord'),
- );
-}
-</com:TTextHighlighter>
-
-<p>
-Un tableau de <tt>UserRecord</tt> ainsi que les messages correspondants peuvent être lu de la manière suivante :
-</p>
-
-<com:TTextHighlighter CssClass="source" Language="php">
-$users = UserRecord::finder()->withPosts()->findAll();
-</com:TTextHighlighter>
-
-<com:TipBox>
-La méthode <tt>withXXX()</tt> (avec XXX qui est le nom de la propriété de la relation, dans notre cas <tt>Posts</tt>) lit les données correspondantes de <tt>PostRecords</tt> en utilisant une deuxième requête (mais pas en utilisant une jointure). La méthode <tt>withXXX()</tt> accepte les mêmes arguments que les autres méthodes <tt>finder</tt> de l'objet Active record, ie : <tt>withPosts('status = ?', 0)</tt>.
-</com:TipBox>
-
-<p>
-Plus d'informations sont disponibles dans le manuel de démarrage rapide <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
-</p>
-
-</com:TContent> \ No newline at end of file
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page b/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page
deleted file mode 100755
index d982e388..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page
+++ /dev/null
@@ -1,70 +0,0 @@
-<com:TContent ID="Main">
-
-<h1>Création de la base</h1>
-<
-<p>
-La plupart des applications Web utilisent une base de données pour conserver les informations. Notre blog n'est pas une exception. Dans cette section, nous allons décrire comment écrire une application qui interagit avec une base de données. Nous allons utiliser les deux moyens suivants <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.DAO">database access object (DAO)</a> et <a href="http://www.pradosoft.com/demos/quickstart/?page=Database.ActiveRecord">Active Record</a>.
-</p>
-
-<p>
-Pour ce tutoriel, nous avons simplifié les besoins, nous aurons juste à gérer les utilisateurs et les messages. Nous allons donc créer deux tables <tt>users</tt> et <tt>posts</tt>, comme décrit dans le diagramme ci-après.
-</p>
-
-<img src="<%~ ER.gif %>" class="output" />
-
-<p>
-Nous utilisons une base de données SQLite 3 pour conserver nos données. La première étape est de convertir notre diagramme en commandes SQL et de l'enregistrer dans le fichier <tt>protected/schema.sql</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source">
-/* création de la table utilisateurs */
-CREATE TABLE users (
- username VARCHAR(128) NOT NULL PRIMARY KEY,
- email VARCHAR(128) NOT NULL,
- password VARCHAR(128) NOT NULL, /* mot de passe en clair */
- role INTEGER NOT NULL, /* 0: utilisateur normal, 1: administrateur */
- first_name VARCHAR(128),
- last_name VARCHAR(128)
-);
-
-/* création de la table messages */
-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, /* UNIX timestamp */
- title VARCHAR(256) NOT NULL, /* titre du message */
- content TEXT, /* corps du message */
- status INTEGER NOT NULL /* 0: publié; 1: brouillon; 2: en attente; 2: accès interdit */
-);
-
-/* insertion de quelques données initiales */
-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>
-La contrainte <tt>fk_author</tt> est ignorée par SQlite vu que SQLite ne supporte pas les <a href="http://www.sqlite.org/omitted.html">clés étrangères</a>.
-Néanmoins, nous gardons cette contrainte dans le but de pouvoir porter notre blog sur d'autres SGBD. Par ailleurs, nous utilisons la capacité <a href="http://www.sqlite.org/autoinc.html">auto incrémenté</a> du champ <tt>posts.post_id</tt> si celui-ci est renseigné à NULL lors de l'insertion.
-</com:NoteBox>
-
-<p>
-Nous utilisons après ceci, les <a href="http://www.sqlite.org/download.html">outils en ligne de commande SQLite</a> pour créer la base de données. Nous avons créé un dossier <tt>protected/data</tt> qui contiendra le fichier de base de données. Nous lançons maintenant la ligne de commande suivante dans le dossier <tt>protected/data</tt>.
-</p>
-
-<com:TTextHighlighter CssClass="source cli">
-sqlite3 blog.db < ../schema.sql
-</com:TTextHighlighter>
-
-<p>
-La base de données est ainsi créée dans le fichier <tt>protected/data/blog.db</tt> et nous pouvons maintenant voir la l'arborescence suivante :
-</p>
-
-<img src="<%~ directories.gif %>" class="output" />
-
-<com:NoteBox>
-Il est nécessaire pour SQLite que le dossier <tt>protected/data</tt> et le fichier <tt>protected/data/blog.db</tt> soient accessibles en écriture par le serveur Web.
-</com:NoteBox>
-
-</com:TContent> \ No newline at end of file
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif b/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif
deleted file mode 100755
index 7a5397b3..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif
+++ /dev/null
Binary files differ
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd b/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd
deleted file mode 100755
index 474833fd..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd
+++ /dev/null
Binary files differ
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif
deleted file mode 100755
index 797ef932..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif
+++ /dev/null
Binary files differ
diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif
deleted file mode 100755
index b053b4c6..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif
+++ /dev/null
Binary files differ
diff --git a/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page
deleted file mode 100755
index b9610d21..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/ConnectDB.page
+++ /dev/null
@@ -1,46 +0,0 @@
-<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
deleted file mode 100755
index 5a211905..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/CreateAR.page
+++ /dev/null
@@ -1,178 +0,0 @@
-<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" Language="text">
-php path/ke/prado-cli.php shell .
-</com:TTextHighlighter>
-
-<p>
-Kita akan melihat
-</p>
-
-<com:TTextHighlighter CssClass="source cli" 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>
-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 sebelumnya
-
- public $author; //menampung array UserRecord
-
- public 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
-
- public 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
deleted file mode 100755
index 30868268..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/CreateDB.page
+++ /dev/null
@@ -1,69 +0,0 @@
-<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
deleted file mode 100755
index 7a5397b3..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/ER.gif
+++ /dev/null
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
deleted file mode 100755
index 797ef932..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/directories.gif
+++ /dev/null
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
deleted file mode 100755
index b053b4c6..00000000
--- a/demos/blog-tutorial/protected/pages/Day2/id/directories2.gif
+++ /dev/null
Binary files differ