Changeset 173
- Timestamp:
- 04/09/07 13:32:19 (2 years ago)
- Files:
-
- trunk/docs/tutorial-fr.markdown (modified) (19 diffs)
- trunk/docs/tutorial.markdown (modified) (3 diffs)
- trunk/lib/AkActiveRecord.php (modified) (2 diffs)
- trunk/lib/AkActiveRecord/AkAssociatedActiveRecord.php (modified) (5 diffs)
- trunk/test/unit/lib/AkActiveRecord.php (modified) (1 diff)
- trunk/test/unit/lib/AkActiveRecord/_AkActiveRecord_associated_inclusion.php (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/docs/tutorial-fr.markdown
r137 r173 1 Comment cr �er une application simple gr�ce au framework Akelos1 Comment créer une application simple grâce au framework Akelos 2 2 ========================================================= 3 3 … … 5 5 -------------------------- 6 6 7 Ce tutoriel va vous permettre de cr �er une application �l'aide du framework Akelos.8 Nous allons donc cr �er **booklink**, une application de gestion de livres et de leurs auteurs.9 10 Configuration n �cessaire7 Ce tutoriel va vous permettre de créer une application à l'aide du framework Akelos. 8 Nous allons donc créer **booklink**, une application de gestion de livres et de leurs auteurs. 9 10 Configuration nécessaire 11 11 --------------------------- 12 12 13 - Une base de donn �es de type MySQL ou SQLite13 - Une base de données de type MySQL ou SQLite 14 14 - Un serveur web Apache 15 - Un acc �s shell �votre serveur ('cmd' sur Windows)15 - Un accès shell à votre serveur ('cmd' sur Windows) 16 16 - PHP4 or PHP5 17 17 18 Cette configuration est plut �t commune et se retrouve sur la plupart des serveurs web ou machines *NIX.19 Bien s �r, Akelos fonctionne sur plusieurs types de configuration, mais pour ce tutoriel, nous nous concentrerons sur celle-ci.20 21 T �l�chargement et installation18 Cette configuration est plutôt commune et se retrouve sur la plupart des serveurs web ou machines *NIX. 19 Bien sûr, Akelos fonctionne sur plusieurs types de configuration, mais pour ce tutoriel, nous nous concentrerons sur celle-ci. 20 21 Téléchargement et installation 22 22 --------------------------- 23 23 24 Tant qu'Akelos n'est pas sorti dans sa version finale (1.0), nous vous recommandons de toujours utiliser la derni �re r�vision SVN.25 Pour cela, il vous faudra poss �der un client [subversion](http://subversion.tigris.org).26 27 Pour r �cup�rer la derni�re r�vision d'Akelos, tapez la commande :24 Tant qu'Akelos n'est pas sorti dans sa version finale (1.0), nous vous recommandons de toujours utiliser la dernière révision SVN. 25 Pour cela, il vous faudra posséder un client [subversion](http://subversion.tigris.org). 26 27 Pour récupérer la dernière révision d'Akelos, tapez la commande : 28 28 29 29 svn co http://akelosframework.googlecode.com/svn/trunk/ akelos 30 30 31 Si jamais vous ne pouvez ou ne voulez pas utiliser subversion, vous pouvez toujours t �l�charger la [derni�re version stable](http://www.akelos.org/akelos_framework-dev_preview.tar.gz).31 Si jamais vous ne pouvez ou ne voulez pas utiliser subversion, vous pouvez toujours télécharger la [dernière version stable](http://www.akelos.org/akelos_framework-dev_preview.tar.gz). 32 32 Vous pouvez ensuite l'extraire en tapant : 33 33 34 34 tar zxvf akelos_framework-dev_preview.tar.gz ; mv akelos_framework-dev_preview akelos 35 35 36 Il faut maintenant s'assurer qu'Akelos sera capable d'utiliser PHP sur votre syst �me. Tapez donc :36 Il faut maintenant s'assurer qu'Akelos sera capable d'utiliser PHP sur votre système. Tapez donc : 37 37 38 38 /usr/bin/env php -v … … 44 44 Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies 45 45 46 alors vous �tes pr�ts �utiliser Akelos, vous pouvez donc passer au paragraphe suivant.47 48 Cependant, si ce n'est pas le cas, il vous faudra trouver le chemin complet vers votre binaire PHP. En g �n�ral, il suffit de taper :46 alors vous êtes prêts à utiliser Akelos, vous pouvez donc passer au paragraphe suivant. 47 48 Cependant, si ce n'est pas le cas, il vous faudra trouver le chemin complet vers votre binaire PHP. En général, il suffit de taper : 49 49 50 50 which php 51 51 52 Ensuite, changez le chemin dans le shebang `#!/usr/bin/env php` par le votre, et ce, au d �but de chacun de ces fichiers :52 Ensuite, changez le chemin dans le shebang `#!/usr/bin/env php` par le votre, et ce, au début de chacun de ces fichiers : 53 53 54 54 * script/console … … 66 66 --------------------------------------------- 67 67 68 A ce point, vous devez avoir Akelos mis en place, et devez �tre capable de lancer les scripts PHP depuis une console. Bien que ces scripts ne soient pas absolument n�cessaires au fonctionnement d'Akelos, ils le seront pour ce tutoriel.69 70 Vous avez maintenant deux possibilit �s :71 72 1. Cr �er une application Akelos dans un dossier diff�rent et lier ce dernier aux librairies du Framework.73 2. Commencer � travailler directement depuis le dossier t�l�charg�, avec la s�curit� que cela implique : il n'est jamais recommand�de rendre visibles les sources de votre application.74 75 Vous l'aurez s �rement devin�, nous utiliserons la premi�re m�thode qui consiste � cr�er un lien (symbolique par exemple) vers le dossier `public` de notre application. Il est aussi tr�s simple de configurer les dossiers du framework, puisqu'il suffit de d�finir l'emplacement de chacun des composants. Cependant, ce n'est pas le sujet de cette explication, et laissons cette partie �un prochain tutoriel expliquant la mise en place et en production d'une application.76 77 Nous supposerons que vous avez t �l�charg� Akelos dans le dossier `HOME_DIR/akelos` et que vous vous situez �la racine du dossier `akelos`.78 D'ici, vous pouvez obtenir les diff �rentes options d'installation du framework en tapant :68 A ce point, vous devez avoir Akelos mis en place, et devez être capable de lancer les scripts PHP depuis une console. Bien que ces scripts ne soient pas absolument nécessaires au fonctionnement d'Akelos, ils le seront pour ce tutoriel. 69 70 Vous avez maintenant deux possibilités : 71 72 1. Créer une application Akelos dans un dossier différent et lier ce dernier aux librairies du Framework. 73 2. Commencer à travailler directement depuis le dossier téléchargé, avec la sécurité que cela implique : il n'est jamais recommandé de rendre visibles les sources de votre application. 74 75 Vous l'aurez sûrement deviné, nous utiliserons la première méthode qui consiste à créer un lien (symbolique par exemple) vers le dossier `public` de notre application. Il est aussi très simple de configurer les dossiers du framework, puisqu'il suffit de définir l'emplacement de chacun des composants. Cependant, ce n'est pas le sujet de cette explication, et laissons cette partie à un prochain tutoriel expliquant la mise en place et en production d'une application. 76 77 Nous supposerons que vous avez téléchargé Akelos dans le dossier `HOME_DIR/akelos` et que vous vous situez à la racine du dossier `akelos`. 78 D'ici, vous pouvez obtenir les différentes options d'installation du framework en tapant : 79 79 80 80 ./script/setup -h … … 98 98 Utilisation: setup [-sqphf --dependencies] <-d> 99 99 100 -deps --dependencies Inclut une copie du framework dans le r �pertoire de100 -deps --dependencies Inclut une copie du framework dans le répertoire de 101 101 l'application. (true) 102 102 -d --directory=<value> Dossier d'installation de l'application. 103 -f --force �craser les fichiers existants. (false)103 -f --force Écraser les fichiers existants. (false) 104 104 -h --help Affiche cette aide. 105 -p --public_html=<value> Dossier par lequel le serveur web va acc �der �105 -p --public_html=<value> Dossier par lequel le serveur web va accéder à 106 106 l'application. 107 107 -q --quiet N'affiche rien. (false) 108 -s --skip Ne copie pas les fichiers d �j�existants. (false)108 -s --skip Ne copie pas les fichiers déjà existants. (false) 109 109 110 110 Voici un exemple de commande d'installation : (remplacez `/www/htdocs` par le chemin vers votre serveur web) … … 112 112 ./script/setup -d ~/booklink -p /www/htdocs/booklink 113 113 114 Cela va g �n�rer l'architecture suivante pour l'application **booklink** :114 Cela va générer l'architecture suivante pour l'application **booklink** : 115 115 116 116 booklink/ 117 app/ << L'application (mod �les, vues, contr�leurs, et installeurs)117 app/ << L'application (modèles, vues, contrôleurs, et installeurs) 118 118 config/ << Des machins de configuration, mais tout sera fait via navigateur. 119 119 public/ << Le seul dossier rendu public 120 script/ << Outils de g �n�ration de code, de lancement de tests, etc.121 122 **Pour les utilisateurs de Windows :** Les liens symboliques ne fonctionnent pas non plus sous Windows. Il va donc falloir renseigner Apache sur le chemin vers votre application. �ditez le fichier `httpd.conf` et rajoutez ceci (en modifiant, bien entendu, au pr�alable selon votre configuration) :120 script/ << Outils de génération de code, de lancement de tests, etc. 121 122 **Pour les utilisateurs de Windows :** Les liens symboliques ne fonctionnent pas non plus sous Windows. Il va donc falloir renseigner Apache sur le chemin vers votre application. Éditez le fichier `httpd.conf` et rajoutez ceci (en modifiant, bien entendu, au préalable selon votre configuration) : 123 123 124 124 Alias /booklink "/chemin/vers/booklink/public" … … 131 131 </Directory> 132 132 133 N'oubliez pas de red �marrer le serveur Apache.134 135 ### Cr �ation de la base de donn�es (MySQL) ###136 137 **/!\ Si vous comptez utiliser SQLite, sautez cette �tape /!\\**138 139 La prochaine �tape consiste � cr�er la base de donn�es relative �votre application.140 141 Le but de ce tutoriel n'est bien �videmment pas de vous apprendre � cr�er une base de donn�es. Si vous ne savez pas comment faire, faites des recherches sur Google, vous trouverez s�rement quelquechose :).142 143 Cependant, vous pouvez tout simplement essayer de cr �er 3 bases diff�rentes, pour chacun des 3 environnements (production, d�veloppement, tests)133 N'oubliez pas de redémarrer le serveur Apache. 134 135 ### Création de la base de données (MySQL) ### 136 137 **/!\ Si vous comptez utiliser SQLite, sautez cette étape /!\\** 138 139 La prochaine étape consiste à créer la base de données relative à votre application. 140 141 Le but de ce tutoriel n'est bien évidemment pas de vous apprendre à créer une base de données. Si vous ne savez pas comment faire, faites des recherches sur Google, vous trouverez sûrement quelquechose :). 142 143 Cependant, vous pouvez tout simplement essayer de créer 3 bases différentes, pour chacun des 3 environnements (production, développement, tests) 144 144 145 145 $> mysql -u root -p … … 152 152 mysql> exit 153 153 154 Vous pouvez bien �videmment passer par une interface graphique, telle phpMyAdmin, pour cr�er ces tables.155 156 ### Cr �ation des fichiers de configuration ###157 158 #### �l'aide de l'installeur ####159 160 Vous pouvez ouvrir votre navigateur et vous rendre sur le script d'installation en allant �l'adresse `http://localhost/booklink`.161 162 Vous allez donc pouvoir configurer votre base de donn �es, vos diff�rents langages, et les permissions de vos fichiers. Le fichier de configuration sera enfin g�n�r�. Pendant que bermi s'occupe de prendre un caf� en attendant que les Anglais et les Espagnols configurent leur application **booklink**, je pencherais plut�t pour un p'tit chocolat chaud.163 164 #### Configuration manuelle (non, pas le pr �nom) ####165 166 Copiez les fichiers `config/DEFAULT-config.php` et `config/DEFAULT-routes.php` en tant que `config/config.php` et `config/routes.php`, respectivement, et �ditez-les �vos soins.167 168 Il vous faudra probablement aussi d �finir le dossier � partir duquel s'effectue la r�-�criture d'URL (afin de pouvoir utiliser des URL propres). �ditez donc le fichier `public/.htaccess`, et changez la valeur de RewriteBase :154 Vous pouvez bien évidemment passer par une interface graphique, telle phpMyAdmin, pour créer ces tables. 155 156 ### Création des fichiers de configuration ### 157 158 #### À l'aide de l'installeur #### 159 160 Vous pouvez ouvrir votre navigateur et vous rendre sur le script d'installation en allant à l'adresse `http://localhost/booklink`. 161 162 Vous allez donc pouvoir configurer votre base de données, vos différents langages, et les permissions de vos fichiers. Le fichier de configuration sera enfin généré. Pendant que bermi s'occupe de prendre un café en attendant que les Anglais et les Espagnols configurent leur application **booklink**, je pencherais plutôt pour un p'tit chocolat chaud. 163 164 #### Configuration manuelle (non, pas le prénom) #### 165 166 Copiez les fichiers `config/DEFAULT-config.php` et `config/DEFAULT-routes.php` en tant que `config/config.php` et `config/routes.php`, respectivement, et éditez-les à vos soins. 167 168 Il vous faudra probablement aussi définir le dossier à partir duquel s'effectue la ré-écriture d'URL (afin de pouvoir utiliser des URL propres). Éditez donc le fichier `public/.htaccess`, et changez la valeur de RewriteBase : 169 169 170 170 RewriteBase /booklink 171 171 172 Une fois votre application install �e, vous pouvez ouvrir un navigateur et aller sur `http://localhost/booklink`. Un message d'accueil s'affichera, et vous pourrez alors supprimer les fichiers d'installation du framework.173 174 Structure de la base de donn �es172 Une fois votre application installée, vous pouvez ouvrir un navigateur et aller sur `http://localhost/booklink`. Un message d'accueil s'affichera, et vous pourrez alors supprimer les fichiers d'installation du framework. 173 174 Structure de la base de données 175 175 --------------------------------- 176 176 177 Il va maintenant falloir d �finir les tables que **booklink** va utiliser pour stocker les informations sur les livres et leurs auteurs.178 179 La plupart du temps, lorsque l'on travaille avec d'autres d �veloppeurs, le sch�ma de la base de donn�es est susceptible de changer. Il devient alors compliqu� de maintenir cette base identique pour chaque personne du projet. Akelos propose donc une solution � ce probl�me, appel�e *installer*, ou *migration*.180 181 Gr �ce � cet outil de migration, vous allez non seulement pouvoir cr�er vos bases de donn�es, mais aussi g�n�rer un installeur, qui pourra �tre utilis� pour enregistrer tous les diff�rents changements que vous effectuerez sur la base.182 183 Pour ce tutoriel, cr �ez le fichier `app/installers/booklink_installer.php`, et copiez-y le contenu suivant :177 Il va maintenant falloir définir les tables que **booklink** va utiliser pour stocker les informations sur les livres et leurs auteurs. 178 179 La plupart du temps, lorsque l'on travaille avec d'autres développeurs, le schéma de la base de données est susceptible de changer. Il devient alors compliqué de maintenir cette base identique pour chaque personne du projet. Akelos propose donc une solution à ce problème, appelée *installer*, ou *migration*. 180 181 Grâce à cet outil de migration, vous allez non seulement pouvoir créer vos bases de données, mais aussi générer un installeur, qui pourra être utilisé pour enregistrer tous les différents changements que vous effectuerez sur la base. 182 183 Pour ce tutoriel, créez le fichier `app/installers/booklink_installer.php`, et copiez-y le contenu suivant : 184 184 185 185 <?php … … 190 190 191 191 $this->createTable('books', 192 'id,'. // La cl �primaire192 'id,'. // La clé primaire 193 193 'title,'. // Le titre du livre 194 194 'description,'. // La description du livre 195 'author_id,'. // L'identifiant de l'auteur. C'est gr �ce �cela qu'Akelos va pouvoir faire le lien entre les deux.195 'author_id,'. // L'identifiant de l'auteur. C'est grâce à cela qu'Akelos va pouvoir faire le lien entre les deux. 196 196 'published_on' // La date de publication 197 197 ); 198 198 199 199 $this->createTable('authors', 200 'id,'. // La cl �primaire200 'id,'. // La clé primaire 201 201 'name' // Le nom de l'auteur 202 202 ); … … 210 210 ?> 211 211 212 Ce peu de donn �es suffit � Akelos pour cr�er la base de donn�es. En ne sp�cifiant que le nom des colonnes, Akelos choisira lui-m�me leur type en se basant sur les conventions de nommage des tables SQL. Cependant, vous avez bien �videmment la possibilit� de d�finir vous-m�me le typages des colonnes gr�ce �la [syntaxe de PHP Adodb](http://phplens.com/lens/adodb/docs-datadict.htm)213 214 Maintenant que nous avons d �fini les tables, il ne reste plus qu'�les installer. Tapez la commande :212 Ce peu de données suffit à Akelos pour créer la base de données. En ne spécifiant que le nom des colonnes, Akelos choisira lui-même leur type en se basant sur les conventions de nommage des tables SQL. Cependant, vous avez bien évidemment la possibilité de définir vous-même le typages des colonnes grâce à la [syntaxe de PHP Adodb](http://phplens.com/lens/adodb/docs-datadict.htm) 213 214 Maintenant que nous avons défini les tables, il ne reste plus qu'à les installer. Tapez la commande : 215 215 216 216 ./script/migrate Booklink install 217 217 218 Et pouf ! Les tables sont install �es automagiquement ! Avec MySQL, vous devriez obtenir quelque chose du genre :218 Et pouf ! Les tables sont installées automagiquement ! Avec MySQL, vous devriez obtenir quelque chose du genre : 219 219 220 220 **TABLE "BOOKS"** … … 240 240 241 241 242 Mod �les, Vues, et Controlleurs242 Modèles, Vues, et Controlleurs 243 243 ------------------------------------------------------ 244 244 245 Pour faire fonctionner vos applications, Akelos utilise le [motif de conception appel �MVC](http://fr.wikipedia.org/wiki/Motif_de_conception).245 Pour faire fonctionner vos applications, Akelos utilise le [motif de conception appelé MVC](http://fr.wikipedia.org/wiki/Motif_de_conception). 246 246 247 247 ### Les conventions de nommage dans Akelos ### 248 248 249 Le nommage de chaque objet dans Akelos est tr �s important, puisqu'il permet l'automatisation de son fonctionnement.250 251 #### Mod �les ####249 Le nommage de chaque objet dans Akelos est très important, puisqu'il permet l'automatisation de son fonctionnement. 250 251 #### Modèles #### 252 252 253 253 * **Dossier :** /app/models/ 254 254 * **Nom des classes :** au singulier, au format [CamelCase](http://fr.wikipedia.org/wiki/CamelCase) *(BankAccount, User, etc.)* 255 * **Nom des fichiers :** au singulier, s �par�par des underscore *(bank_account.php.php, user.php, etc.)*256 * **Nom des tables :** au pluriel, s �par�par des underscore *(bank_accounts, users)*257 258 #### Contr �leurs ####255 * **Nom des fichiers :** au singulier, séparé par des underscore *(bank_account.php.php, user.php, etc.)* 256 * **Nom des tables :** au pluriel, séparé par des underscore *(bank_accounts, users)* 257 258 #### Contrôleurs #### 259 259 260 260 * **Dossier :** */app/controllers/* 261 261 * **Nom des classes :** Au singulier ou au pluriel, au format CamelCase, fini par `Controller` *(AccountController, UserController)* 262 * **Nom des fichiers :** Au singulier ou au pluriel, s �par�par des underscore, fini par `_controller` *(account_controller.php, user_controller.php)*262 * **Nom des fichiers :** Au singulier ou au pluriel, séparé par des underscore, fini par `_controller` *(account_controller.php, user_controller.php)* 263 263 264 264 #### Vues #### … … 271 271 ------------------------------------------ 272 272 273 Akelos fournit une m �thode de **scaffold**, � savoir une g�n�rateur de code qui vous fera non seulement gagner du temps, mais pourra aussi servir de point de d�part � la construction de votre application, ou �votre apprentissage.273 Akelos fournit une méthode de **scaffold**, à savoir une générateur de code qui vous fera non seulement gagner du temps, mais pourra aussi servir de point de départ à la construction de votre application, ou à votre apprentissage. 274 274 275 275 ### La magie du scaffold ### 276 276 277 �l'aide du scaffolding, vous allez g�n�rer le squelette d'une interface d'administration pour **booklink**, ce qui va vous permettre d'ajouter/�diter/supprimer des entr�es dans la base de donn�es.277 À l'aide du scaffolding, vous allez générer le squelette d'une interface d'administration pour **booklink**, ce qui va vous permettre d'ajouter/éditer/supprimer des entrées dans la base de données. 278 278 Tapez ces deux commandes : 279 279 … … 281 281 ./script/generate scaffold Author 282 282 283 Cela va cr �er une multitude de fichiers l� o�il le faut, et le tout va fonctionner directement ! Sceptique ?284 Allez donc sur [http://localhost/booklink/author](http://localhost/booklink/author) et sur [http://localhost/booklink/books](http://localhost/booklink/books), et vous pourrez d'ores et d �j� g�rer les livres et les auteurs dans votre base de donn�es.285 Allez, je vous laisse un peu de temps pour vous amuser, et revenez me voir d �s que vous �tes pr�ts �continuer.283 Cela va créer une multitude de fichiers là où il le faut, et le tout va fonctionner directement ! Sceptique ? 284 Allez donc sur [http://localhost/booklink/author](http://localhost/booklink/author) et sur [http://localhost/booklink/books](http://localhost/booklink/books), et vous pourrez d'ores et déjà gérer les livres et les auteurs dans votre base de données. 285 Allez, je vous laisse un peu de temps pour vous amuser, et revenez me voir dès que vous êtes prêts à continuer. 286 286 287 287 Le fonctionnement d'Akelos 288 288 ------------------------------------------ 289 289 290 Voici une description rapide de comment Akelos r �agi lorsqu'il r�pond �l'adresse : `http://localhost/booklink/book/show/2`290 Voici une description rapide de comment Akelos réagi lorsqu'il répond à l'adresse : `http://localhost/booklink/book/show/2` 291 291 292 1. Akelos va r �cup�rer trois param�tres, en fonction de ce que vous avez d�fini dans le fichier `/config/routes.php` (tutoriel est �venir) :293 294 * contr �leur : *book*292 1. Akelos va récupérer trois paramètres, en fonction de ce que vous avez défini dans le fichier `/config/routes.php` (tutoriel est à venir) : 293 294 * contrôleur : *book* 295 295 * action : *show* 296 296 * id : 2 … … 298 298 2. Il va ensuite chercher le fichier `/app/controllers/book_controller.php`. S'il existe, il instanciera la classe `BookController`. 299 299 300 3. Le contr �leur instanci� va chercher le mod�le lui correspondant, ici `/app/models/book.php`. Si le mod�le existe, il en cr�e une instance, disponible ici via l'attribut `$this->Book`. Il va ensuite chercher dans la base de donn�es Books l'entr�e avec un `id = 2` qui �crasera l'attribut `$this->Book`.300 3. Le contrôleur instancié va chercher le modèle lui correspondant, ici `/app/models/book.php`. Si le modèle existe, il en crée une instance, disponible ici via l'attribut `$this->Book`. Il va ensuite chercher dans la base de données Books l'entrée avec un `id = 2` qui écrasera l'attribut `$this->Book`. 301 301 302 302 4. Akelos appelle enfin l'action `show` de la classe `BookController`. 303 303 304 5. A la fin de l'action, Akelos chercher le fichier de vue `/app/views/book/show.tpl` et cr �e le rendu de ce fichier, ce dernier �tant aussi disponible dans la variable `$content_for_layout` dans les layouts.305 306 6. Akelos va enfin chercher le fichier layout appel � `/app/views/layouts/book.tpl`. Si ce fichier est trouv�, Akelos cr�e le rendu du layout, et assigne le contenu de la vue dans `$content_for_layout`. Le tout est enfin envoy�au navigateur.307 308 Si vous avez compris ce fonctionnement, je pense que vous pouvez d'ores et d �j� commencer �modifier votre application.304 5. A la fin de l'action, Akelos chercher le fichier de vue `/app/views/book/show.tpl` et crée le rendu de ce fichier, ce dernier étant aussi disponible dans la variable `$content_for_layout` dans les layouts. 305 306 6. Akelos va enfin chercher le fichier layout appelé `/app/views/layouts/book.tpl`. Si ce fichier est trouvé, Akelos crée le rendu du layout, et assigne le contenu de la vue dans `$content_for_layout`. Le tout est enfin envoyé au navigateur. 307 308 Si vous avez compris ce fonctionnement, je pense que vous pouvez d'ores et déjà commencer à modifier votre application. 309 309 310 310 Faire la relation entre *Books* et *Authors* 311 311 ---------------------------- 312 312 313 Il va maintenant falloir cr �er le lien entre la classe *Book* et la classe *Author*. Pour cela, il vous faudra utiliser la colonne `author_id` dans la base *books*314 315 Pour renseigner chacun des mod �les sur la relation entre *books* et *authors*, il vous suffit de faire :313 Il va maintenant falloir créer le lien entre la classe *Book* et la classe *Author*. Pour cela, il vous faudra utiliser la colonne `author_id` dans la base *books* 314 315 Pour renseigner chacun des modèles sur la relation entre *books* et *authors*, il vous suffit de faire : 316 316 317 317 `/app/models/book.php` … … 321 321 class Book extends ActiveRecord 322 322 { 323 var $belongs_to = 'author'; // Un livre correspond �un auteur323 var $belongs_to = 'author'; // Un livre correspond à un auteur 324 324 } 325 325 … … 332 332 class Author extends ActiveRecord 333 333 { 334 var $has_many = 'books'; // Un auteur peut poss �der plusieurs livres334 var $has_many = 'books'; // Un auteur peut posséder plusieurs livres 335 335 } 336 336 337 337 ?> 338 338 339 Les mod �les savent maintenant comment ils sont li�s, mais il faut que le contr�leur `BookController` puisse charger les deux mod�les, `author` et `book`.339 Les modèles savent maintenant comment ils sont liés, mais il faut que le contrôleur `BookController` puisse charger les deux modèles, `author` et `book`. 340 340 341 341 `/app/models/author.php` … … 345 345 class BookController extends ApplicationController 346 346 { 347 var $models = 'book, author'; // Cette ligne suffit � indiquer quels mod�les utiliser347 var $models = 'book, author'; // Cette ligne suffit à indiquer quels modèles utiliser 348 348 349 349 // ... code du controlleur 350 351 function show() 352 { 353 // Remplacer "$this->book = $this->Book->find(@$this->params['id']);" 354 // par celle-ci 355 $this->book = $this->Book->find(@$this->params['id'], array('include' => 'author')); 356 } 357 358 // suite et fin du code du controlleur 350 359 } 351 360 352 La prochaine �tape consiste � afficher les auteurs disponibles dans la base lors de l'ajout/�dition d'un livre. Il suffit pour cela d'utiliser, dans la vue,361 La prochaine étape consiste à afficher les auteurs disponibles dans la base lors de l'ajout/édition d'un livre. Il suffit pour cela d'utiliser, dans la vue, 353 362 la variable `$form_options_helper`. 354 363 355 Juste apr �s `<?=$active_record_helper->error_messages_for('book');?>`, dans le fichier */app/views/book/_form.tpl*, rajoutez le code suivant :364 Juste après `<?=$active_record_helper->error_messages_for('book');?>`, dans le fichier */app/views/book/_form.tpl*, rajoutez le code suivant : 356 365 357 366 `/app/views/book/_form.tpl` … … 362 371 </p> 363 372 364 Si vous n'avez pas encore ajout � d'auteurs dans votre base de donn�es (vilain garnement), c'est le moment de le faire.365 366 Vous pouvez donc d �sormais choisir l'auteur de chaque livre. C'est magnifique ! Mais vous avez s�rement remarqu�que vous ne voyez pas l'auteur des livres dans la liste des livres.367 Ouvrez donc le fichier `app/views/book/show.tpl`, et juste apr �s `<? $content_columns = array_keys($Book->getContentColumns()); ?>`, rajoutez :373 Si vous n'avez pas encore ajouté d'auteurs dans votre base de données (vilain garnement), c'est le moment de le faire. 374 375 Vous pouvez donc désormais choisir l'auteur de chaque livre. C'est magnifique ! Mais vous avez sûrement remarqué que vous ne voyez pas l'auteur des livres dans la liste des livres. 376 Ouvrez donc le fichier `app/views/book/show.tpl`, et juste après `<? $content_columns = array_keys($Book->getContentColumns()); ?>`, rajoutez : 368 377 369 378 <label>_{Author}:</label> <span class="static">{book.author.name?}</span><br /> 370 379 371 Vous vous demandez s �rement ce que ces `_{Author}` ou autre `{book.author.name?}`. C'est en fait la syntaxe utilis�e par [Sintags](http://www.bermi.org/projects/sintags) dans les templates d'Akelos.380 Vous vous demandez sûrement ce que ces `_{Author}` ou autre `{book.author.name?}`. C'est en fait la syntaxe utilisée par [Sintags](http://www.bermi.org/projects/sintags) dans les templates d'Akelos. 372 381 373 382 … … 375 384 -------------------- 376 385 377 C'est tout pour le moment. Ce tutoriel continuera bien s �r d'�voluer, et il y en aura d'autres, car ce ne sont pas l� les seules fonctionnalit�s d'Akelos !378 Si vous voyez une faute de frappe ou de fran �ais, n'h�sitez pas �me le faire savoir !386 C'est tout pour le moment. Ce tutoriel continuera bien sûr d'évoluer, et il y en aura d'autres, car ce ne sont pas là les seules fonctionnalités d'Akelos ! 387 Si vous voyez une faute de frappe ou de français, n'hésitez pas à me le faire savoir ! trunk/docs/tutorial.markdown
r146 r173 258 258 ./script/generate scaffold Author 259 259 260 This will generate a b runch of files and folderwith code that really works!. Don't trust me? Try it yourself. Point your browser to [http://localhost/booklink/author](http://localhost/booklink/author) and [http://localhost/booklink/books](http://localhost/booklink/books) to start adding authors and books. Create some records and come back for an explanation of what is going under the hood.260 This will generate a bunch of files and folders with code that really works!. Don't trust me? Try it yourself. Point your browser to [http://localhost/booklink/author](http://localhost/booklink/author) and [http://localhost/booklink/books](http://localhost/booklink/books) to start adding authors and books. Create some records and come back for an explanation of what is going under the hood. 261 261 262 262 … … 316 316 Now that you made the models aware of each other you will need to modify the book controller so it loads the `author` and the `book` model instances 317 317 318 */app/ models/author.php*318 */app/controllers/book_controller.php* 319 319 320 320 <?php … … 325 325 326 326 // ... more BookController code 327 328 // ... more BookController code 329 330 function show() 331 { 332 // Replace "$this->book = $this->Book->find(@$this->params['id']);" 333 // with this in order to find related authors. 334 $this->book = $this->Book->find(@$this->params['id'], array('include' => 'author')); 335 } 336 337 // ... more BookController code 338 } 327 339 328 340 Next step is to show available authors when creating or editing a book. This can be achieved using the `$form_options_helper` by inserting the following code trunk/lib/AkActiveRecord.php
r161 r173 861 861 switch ($args[0]) { 862 862 case 'first': 863 $result =& $this->find('all', array_merge($options, array('limit'=>1))); 863 864 $options = array_merge($options, array((!empty($options['include']) && $this->hasAssociations() ?'virtual_limit':'limit')=>1)); 865 $result =& $this->find('all', $options); 866 864 867 if(!empty($result) && is_array($result)){ 865 868 $_result =& $result[0]; … … 926 929 927 930 case 1 : 928 929 if(empty($options['include'])){ 930 $result =& $this->find('first', array_merge($options, array('conditions' => $this->getTableName().'.'.$this->getPrimaryKey().' = '.$ids[0].$conditions))); 931 if(is_array($args[0]) && $result !== false){ 932 //This is a dirty hack for avoiding PHP4 pass by reference error 933 $result_for_ref = array(&$result); 934 $_result =& $result_for_ref; 935 }else{ 936 $_result =& $result; 937 } 938 return $_result; 939 940 break; 941 } 931 $table_name = !empty($options['include']) && $this->hasAssociations() ? '__owner' : $this->getTableName(); 932 $result =& $this->find('first', array_merge($options, array('conditions' => $table_name.'.'.$this->getPrimaryKey().' = '.$ids[0].$conditions))); 933 if(is_array($args[0]) && $result !== false){ 934 //This is a dirty hack for avoiding PHP4 pass by reference error 935 $result_for_ref = array(&$result); 936 $_result =& $result_for_ref; 937 }else{ 938 $_result =& $result; 939 } 940 return $_result; 941 942 break; 943 942 944 default: 943 945 trunk/lib/AkActiveRecord/AkAssociatedActiveRecord.php
r132 r173 280 280 } 281 281 282 $result =& $this->_findBySqlWithAssociations($sql, $limit, $offset, $options['include'] );282 $result =& $this->_findBySqlWithAssociations($sql, $limit, $offset, $options['include'], empty($options['virtual_limit']) ? false : $options['virtual_limit']); 283 283 284 284 return $result; … … 336 336 * @todo Refactor in order to increase performance of associated inclussions 337 337 */ 338 function &_findBySqlWithAssociations($sql, $limit = null, $offset = null, $included_associations = array() )338 function &_findBySqlWithAssociations($sql, $limit = null, $offset = null, $included_associations = array(), $virtual_limit = false) 339 339 { 340 340 if(is_array($sql)){ … … 345 345 $this->setConnection(); 346 346 $objects = array(); 347 $_included_results = array(); // Used only in conjuntion with virtual limits for doing find('first',...include'=>... 347 348 if(is_integer($limit)){ 348 349 if(is_integer($offset)){ … … 386 387 $e = null; 387 388 $object_id = $this_item_attributes[$this->getPrimaryKey()]; 389 390 if(!empty($virtual_limit)){ 391 $_included_results[$object_id] = $object_id; 392 if(count($_included_results) > $virtual_limit){ 393 continue; 394 } 395 } 396 388 397 if(!isset($ids[$object_id])){ 389 398 $ids[$object_id] = $i; … … 395 404 $i = $ids[$object_id]; 396 405 } 397 406 398 407 foreach ($associated_items as $association_id=>$attributes){ 399 408 if(count(array_diff($attributes, array(''))) > 0){ trunk/test/unit/lib/AkActiveRecord.php
r161 r173 23 23 'AkActiveRecord_accessible_attributes', 24 24 'AkActiveRecord_calculations', 25 'AkActiveRecord_associated_inclusion', 25 26 ); 26 27
