1 Comment créer une application simple grâce au framework Akelos
2 =========================================================
5 --------------------------
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.
10 Configuration nécessaire
11 ---------------------------
13 - Une base de données de type MySQL ou SQLite
14 - Un serveur web Apache
15 - Un accès shell à votre serveur ('cmd' sur Windows)
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.
21 Téléchargement et installation
22 ---------------------------
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).
27 Pour récupérer la dernière révision d'Akelos, tapez la commande :
29 svn co http://svn.akelos.org/trunk/ akelos
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 Vous pouvez ensuite l'extraire en tapant :
34 tar zxvf akelos_framework-dev_preview.tar.gz ; mv akelos_framework-dev_preview akelos
36 Il faut maintenant s'assurer qu'Akelos sera capable d'utiliser PHP sur votre système. Tapez donc :
40 Si vous voyez quelque chose de ce genre :
42 PHP 5.2.1 (cli) (built: Jan 17 2006 15:00:28)
43 Copyright (c) 1997-2006 The PHP Group
44 Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
46 alors vous êtes prêts à utiliser Akelos, vous pouvez donc passer au paragraphe suivant.
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 :
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 :
61 **Pour les utilisateurs de Windows :** Les shebang ne sont pas pris en compte sur Windows. Il vous faudra donc appeler les scripts directement avec le binaire php :
63 C:\wamp\php\php.exe ./script/generate scaffold
65 Mise en place d'une nouvelle application Akelos
66 ---------------------------------------------
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.
70 Vous avez maintenant deux possibilités :
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.
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.
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 :
82 Vous devriez obtenir l'affichage suivant :
84 Usage: setup [-sqphf --dependencies] <-d>
86 -deps --dependencies Includes a copy of the framework into the application
88 -d --directory=<value> Destination directory for installing the application.
89 -f --force Overwrite files that already exist. (false)
90 -h --help Show this help message.
91 -p --public_html=<value> Location where the application will be accesed by the
93 -q --quiet Suppress normal output. (false)
94 -s --skip Skip files that already exist. (false)
96 Dont voici la traduction :
98 Utilisation: setup [-sqphf --dependencies] <-d>
100 -deps --dependencies Inclut une copie du framework dans le répertoire de
101 l'application. (true)
102 -d --directory=<value> Dossier d'installation de l'application.
103 -f --force Écraser les fichiers existants. (false)
104 -h --help Affiche cette aide.
105 -p --public_html=<value> Dossier par lequel le serveur web va accéder à
107 -q --quiet N'affiche rien. (false)
108 -s --skip Ne copie pas les fichiers déjà existants. (false)
110 Voici un exemple de commande d'installation : (remplacez `/www/htdocs` par le chemin vers votre serveur web)
112 ./script/setup -d ~/booklink -p /www/htdocs/booklink
114 Cela va générer l'architecture suivante pour l'application **booklink** :
117 app/ << L'application (modèles, vues, contrôleurs, et installeurs)
118 config/ << Des machins de configuration, mais tout sera fait via navigateur.
119 public/ << Le seul dossier rendu public
120 script/ << Outils de génération de code, de lancement de tests, etc.
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) :
124 Alias /booklink "/chemin/vers/booklink/public"
126 <Directory "/chemin/vers/booklink/public">
127 Options Indexes FollowSymLinks
133 N'oubliez pas de redémarrer le serveur Apache.
135 ### Création de la base de données (MySQL) ###
137 **/!\ Si vous comptez utiliser SQLite, sautez cette étape /!\\**
139 La prochaine étape consiste à créer la base de données relative à votre application.
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 :).
143 Cependant, vous pouvez tout simplement essayer de créer 3 bases différentes, pour chacun des 3 environnements (production, développement, tests)
147 mysql> CREATE DATABASE booklink;
148 mysql> CREATE DATABASE booklink_dev;
149 mysql> CREATE DATABASE booklink_tests;
151 mysql> FLUSH PRIVILEGES;
154 Vous pouvez bien évidemment passer par une interface graphique, telle phpMyAdmin, pour créer ces tables.
156 ### Création des fichiers de configuration ###
158 #### À l'aide de l'installeur ####
160 Vous pouvez ouvrir votre navigateur et vous rendre sur le script d'installation en allant à l'adresse `http://localhost/booklink`.
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.
164 #### Configuration manuelle (non, pas le prénom) ####
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.
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 :
170 RewriteBase /booklink
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.
174 Structure de la base de données
175 ---------------------------------
177 Il va maintenant falloir définir les tables que **booklink** va utiliser pour stocker les informations sur les livres et leurs auteurs.
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*.
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.
183 Pour ce tutoriel, créez le fichier `app/installers/booklink_installer.php`, et copiez-y le contenu suivant :
187 class BooklinkInstaller extends AkInstaller
191 $this->createTable('books',
192 'id,'. // La clé primaire
193 'title,'. // Le titre du livre
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.
196 'published_on' // La date de publication
199 $this->createTable('authors',
200 'id,'. // La clé primaire
201 'name' // Le nom de l'auteur
206 $this->dropTables('books','authors');
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)
214 Maintenant que nous avons défini les tables, il ne reste plus qu'à les installer. Tapez la commande :
216 ./script/migrate Booklink install
218 Et pouf ! Les tables sont installées automagiquement ! Avec MySQL, vous devriez obtenir quelque chose du genre :
222 +--------------+--------------+------+-----+----------------+
223 | Field | Type | Null | Key | Extra |
224 +--------------+--------------+------+-----+----------------+
225 | id | int(11) | NO | PRI | auto_increment |
226 | title | varchar(255) | YES | | |
227 | description | longtext | YES | | |
228 | author_id | int(11) | YES | MUL | |
229 | published_on | date | YES | | |
230 | updated_at | datetime | YES | | |
231 | created_at | datetime | YES | | |
232 +--------------+--------------+------+-----+----------------+
236 +--------------+--------------+------+-----+----------------+
237 | Field | Type | Null | Key | Extra |
238 +--------------+--------------+------+-----+----------------+
239 | id | int(11) | NO | PRI | auto_increment |
240 | name | varchar(255) | YES | | |
241 | updated_at | datetime | YES | | |
242 | created_at | datetime | YES | | |
243 +--------------+--------------+------+-----+----------------+
246 Modèles, Vues, et Controlleurs
247 ------------------------------------------------------
249 Pour faire fonctionner vos applications, Akelos utilise le [motif de conception appelé MVC](http://fr.wikipedia.org/wiki/Motif_de_conception).
251 ![Diagrame de fonction du modèle MVC avec Akelos.](http://svn.akelos.org/trunk/docs/images/akelos_mvc-fr.png)
253 ### Les conventions de nommage dans Akelos ###
255 Le nommage de chaque objet dans Akelos est très important, puisqu'il permet l'automatisation de son fonctionnement.
259 * **Dossier :** /app/models/
260 * **Nom des classes :** au singulier, au format [CamelCase](http://fr.wikipedia.org/wiki/CamelCase) *(BankAccount, User, etc.)*
261 * **Nom des fichiers :** au singulier, séparé par des underscore *(bank_account.php.php, user.php, etc.)*
262 * **Nom des tables :** au pluriel, séparé par des underscore *(bank_accounts, users)*
264 #### Contrôleurs ####
266 * **Dossier :** */app/controllers/*
267 * **Nom des classes :** Au singulier ou au pluriel, au format CamelCase, fini par `Controller` *(AccountController, UserController)*
268 * **Nom des fichiers :** Au singulier ou au pluriel, séparé par des underscore, fini par `_controller` *(`account_controller.php`, `user_controller.php`)*
272 * **Dossier :** /app/views/ + *nom_du_controller_avec_underscore/* *(app/views/account, app/views/super_user/)*
273 * **Nom des fichiers :** Nom de l'action, en minuscules *(app/views/user/show.tpl)*
276 Utilisation du scaffolding dans Akelos
277 ------------------------------------------
279 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.
281 ### La magie du scaffold ###
283 À 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.
284 Tapez ces deux commandes :
286 ./script/generate scaffold Book
287 ./script/generate scaffold Author
289 Cela va créer une multitude de fichiers là où il le faut, et le tout va fonctionner directement ! Sceptique ?
290 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.
291 Allez, je vous laisse un peu de temps pour vous amuser, et revenez me voir dès que vous êtes prêts à continuer.
293 Le fonctionnement d'Akelos
294 ------------------------------------------
296 Voici une description rapide de comment Akelos réagi lorsqu'il répond à l'adresse : `http://localhost/booklink/book/show/2`
298 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) :
303 2. Il va ensuite chercher le fichier `/app/controllers/book_controller.php`. S'il existe, il instanciera la classe `BookController`.
305 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`.
307 4. Akelos appelle enfin l'action `show` de la classe `BookController`.
309 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.
311 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.
313 Si vous avez compris ce fonctionnement, je pense que vous pouvez d'ores et déjà commencer à modifier votre application.
315 Faire la relation entre *Books* et *Authors*
316 ----------------------------
318 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*
320 Pour renseigner chacun des modèles sur la relation entre *books* et *authors*, il vous suffit de faire :
322 `/app/models/book.php`
326 class Book extends ActiveRecord
328 var $belongs_to = 'author'; // Un livre correspond à un auteur
333 `/app/models/author.php`
337 class Author extends ActiveRecord
339 var $has_many = 'books'; // Un auteur peut posséder plusieurs livres
344 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`.
346 `/app/models/author.php`
350 class BookController extends ApplicationController
352 var $models = 'book, author'; // Cette ligne suffit à indiquer quels modèles utiliser
354 // ... code du controlleur
358 // Remplacer "$this->book = $this->Book->find(@$this->params['id']);"
360 $this->book = $this->Book->find(@$this->params['id'], array('include' => 'author'));
363 // suite et fin du code du controlleur
366 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,
367 la variable `$form_options_helper`.
369 Juste après `<?=$active_record_helper->error_messages_for('book');?>`, dans le fichier */app/views/book/_form.tpl*, rajoutez le code suivant :
371 `/app/views/book/_form.tpl`
374 <label for="author">_{Author}</label><br />
375 <?=$form_options_helper->select('book', 'author_id', $Author->collect($Author->find(), 'name', 'id'));?>
378 Si vous n'avez pas encore ajouté d'auteurs dans votre base de données (vilain garnement), c'est le moment de le faire.
380 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.
381 Ouvrez donc le fichier `app/views/book/show.tpl`, et juste après `<? $content_columns = array_keys($Book->getContentColumns()); ?>`, rajoutez :
383 <label>_{Author}:</label> <span class="static">{book.author.name?}</span><br />
385 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.
391 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 !
392 Si vous voyez une faute de frappe ou de français, n'hésitez pas à me le faire savoir !
394 ---------------------