From 2fd00de2170fcb16b5214c7839c18f0dacab8cdb Mon Sep 17 00:00:00 2001 From: tof <> Date: Fri, 31 Aug 2007 09:58:35 +0000 Subject: Full translation of Blog Tutorial in French. Thanks to Eric.M ! --- .../protected/pages/Day2/fr/ConnectDB.page | 47 ++++++ .../protected/pages/Day2/fr/CreateAR.page | 177 +++++++++++++++++++++ .../protected/pages/Day2/fr/CreateDB.page | 70 ++++++++ demos/blog-tutorial/protected/pages/Day2/fr/ER.gif | Bin 0 -> 4444 bytes demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd | Bin 0 -> 73216 bytes .../protected/pages/Day2/fr/directories.gif | Bin 0 -> 4580 bytes .../protected/pages/Day2/fr/directories2.gif | Bin 0 -> 6795 bytes 7 files changed, 294 insertions(+) create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/ER.gif create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/directories.gif create mode 100755 demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif (limited to 'demos/blog-tutorial/protected/pages/Day2/fr') diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page b/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page new file mode 100755 index 00000000..bc817c92 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/fr/ConnectDB.page @@ -0,0 +1,47 @@ + + +

Connexion à la base

+ + +

+Pour pouvoir utiliser la base de données que nous venons de créer, nous devons tout d'abord établir une connexion. +

+ +

+Nous allons utiliser Data Access Objects (DAO) 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. +

+ + +Pour utiliser DAO, nous devons installer et activer la librairie PHP PDO extension ainsi que 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 php.ini les lignes suivantes: + +extension=php_pdo.dll +extension=php_pdo_sqlite.dll + + + +

+Pour une meilleure abstraction de notre base de données, nous utilisons aussi la fonctionnalité Active Record (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. +

+ +

+Nous modifions notre fichier de configuration de l'application protected/application.xml en insérant les lignes suivantes, qui indiquent à Active Record comment se connecter à notre base de données. +

+ + + + + + + + + + +

+Dans la configuration précédente, nous avons ajouté deux modules à notre application. Le module TDataSourceConfig est configuré avec la chaine de connexion sqlite:protected/data/blog.db qui pointe vers notre base de données. Cette connexion est utilisée par le module TActiveRecordConfig qui est requis pour l'utilisation d'Active Record. +

+ + +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 documentation Active Record. Il est, de même possible, d'établir une connexion à une base de données en utilisant du code PHP au travers du composant TDbConnection. + + +
\ 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 new file mode 100755 index 00000000..82c1dbf8 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/fr/CreateAR.page @@ -0,0 +1,177 @@ + + +

Création des classes Active Record

+ +

+Nous avons besoin de définir deux classes Active Record, UserRecord et PostRecord, qui représentent respectivement les tables users et posts. Les classes Active Record doivent hériter de la classe ActiveRecord, et doivent définir les propriétés qui correspondent aux champs de la table correspondante. +

+ +

+Pour une meilleure organisation de notre arborescence, nous créons un nouveau dossier protected/database 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 protected/database à notre chemin d'inclusion de PHP (include_path). Cela nous permet d'utiliser nos classes sans avoir besoin de les inclure explicitement. +

+ + + + + + + +

+Au lieu de créer nos classes manuellement, nous allons utiliser les outils en ligne de commande de PRADO pour qu'il nous génère les classes. +

+ +

+Dans le dossier blog, lancer la commande suivante pour entrer dans le mode interactif de l'outil en ligne de commande: +

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

+Vous devriez voir +

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

+A l'invite de commande, entrer les deux commandes suivantes pour créer les classes UserRecord et PostRecord. +

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

+Ici, nous avons utilisés les espaces de noms pour indiquer où les classes seront créées. Le chemin Application.database.UserRecord indique que nous désirons que la classe soit insérée dans protected/database/UserRecord.php. +

+ +

+Nous devrions voir l'arborescence suivante ainsi que nos deux nouveaux fichiers dans le dossier protected/database: +

+ + + +

+Si vous consultez le fichier PostRecord, vous devriez voir le contenu suivant: +

+ + +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); + } +} + + +

+Comme vous pouvez le constater, pour chaque champs de la table posts, la classe déclare un membre correspondant. La constante TABLE indique le nom de la table que gère la classe PostRecord. La méthode statique finder() permet d'effectuer des requêtes et de lire les données sous forme d'objets PostRecord. +

+

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

Relations entre Posts et Users

+

+Rappellez-vous qu'il y a une relation entre les tables users et posts. Le diagramme des relations est indiqué ci-après. +

+ + + +

+A partir de ce diagramme, nous voyons que la table posts contient un champ author_id. Le champ author_id est une clé étrangère qui référence la table users. En particulier, les valeurs du champ author_id doivent apparaitre dans dans le champ username de la table users. 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". +

+ +

+Nous pouvons modéliser les relations entre posts and users dans nos classes PostRecord and UserRecord en les modifiant comme ci-dessous : +

+ + +class PostRecord extends TActiveRecord +{ + //... propriétés et méthodes comme précédemment + + public $author; //contient un objet UserRecord + + protected static $RELATIONS=array + ( + 'author' => array(self::BELONGS_TO, 'UserRecord'), + ); +} + + +

+La propriété statique $RELATIONS de la classe PostRecord définit que la propriété $author fait référence à un UserRecord. Dans le tableau : array(self::BELONGS_TO, 'UserRecord'), le premier élément défini le type de relation, dans notre cas, self::BELONGS_TO. Le deuxième élément est le nom de l'objet en relation, dans notre cas UserRecord. La classe UserRecord est définie comme ci-dessous, la différence est que chaque objet UserRecord contient plusieurs PostRecord. +

+ + +class UserRecord extends TActiveRecord +{ + //... propriétés et méthodes comme précédemment + + public $posts=array(); //contient un tableau de PostRecord + + protected static $RELATIONS=array + ( + 'posts' => array(self::HAS_MANY, 'PostRecord'), + ); +} + + +

+Un tableau de UserRecord ainsi que les messages correspondants peuvent être lu de la manière suivante : +

+ + +$users = UserRecord::finder()->withPosts()->findAll(); + + + +La méthode withXXX() (avec XXX qui est le nom de la propriété de la relation, dans notre cas Posts) lit les données correspondantes de PostRecords en utilisant une deuxième requête (mais pas en utilisant une jointure). La méthode withXXX() accepte les mêmes arguments que les autres méthodes finder de l'objet Active record, ie : withPosts('status = ?', 0). + + +

+Plus d'informations sont disponibles dans le manuel de démarrage rapide Active Record. +

+ +
\ 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 new file mode 100755 index 00000000..d982e388 --- /dev/null +++ b/demos/blog-tutorial/protected/pages/Day2/fr/CreateDB.page @@ -0,0 +1,70 @@ + + +

Création de la base

+< +

+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 database access object (DAO) et Active Record. +

+ +

+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 users et posts, comme décrit dans le diagramme ci-après. +

+ + + +

+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 protected/schema.sql. +

+ + +/* 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); + + + +La contrainte fk_author est ignorée par SQlite vu que SQLite ne supporte pas les clés étrangères. +Néanmoins, nous gardons cette contrainte dans le but de pouvoir porter notre blog sur d'autres SGBD. Par ailleurs, nous utilisons la capacité auto incrémenté du champ posts.post_id si celui-ci est renseigné à NULL lors de l'insertion. + + +

+Nous utilisons après ceci, les outils en ligne de commande SQLite pour créer la base de données. Nous avons créé un dossier protected/data qui contiendra le fichier de base de données. Nous lançons maintenant la ligne de commande suivante dans le dossier protected/data. +

+ + +sqlite3 blog.db < ../schema.sql + + +

+La base de données est ainsi créée dans le fichier protected/data/blog.db et nous pouvons maintenant voir la l'arborescence suivante : +

+ + + + +Il est nécessaire pour SQLite que le dossier protected/data et le fichier protected/data/blog.db soient accessibles en écriture par le serveur Web. + + +
\ 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 new file mode 100755 index 00000000..7a5397b3 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/fr/ER.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd b/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd new file mode 100755 index 00000000..474833fd Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/fr/ER.vsd differ diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif new file mode 100755 index 00000000..797ef932 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/fr/directories.gif differ diff --git a/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif b/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif new file mode 100755 index 00000000..b053b4c6 Binary files /dev/null and b/demos/blog-tutorial/protected/pages/Day2/fr/directories2.gif differ -- cgit v1.2.3