Agavi est fourni avec un petit script, permettant d'automatiser les tâches les plus courantes qui ne sont pas forcement les plus intéressantes. Parmi celle-ci, il y a la création de l'arborescence de base d'une application Web.
Il faut se placer dans le répertoire agavi et lancer la commande agavi project. Il suffit ensuite d'appuyer sur entrée à chaque question pour choisir la proposition par défaut.
fabrice@kimsufi:~/dev/ForumPHP/agavi$ agavi project
Buildfile: /usr/share/php/agavi/build.xml
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > project:
Full path to your new project (no trailing slash!) [/home/fabrice/dev/ForumPHP/agavi]?
Project dir: /home/fabrice/dev/ForumPHP/agavi
[echo] project dir: /home/fabrice/dev/ForumPHP/agavi, app dir: /home/fabrice/dev/ForumPHP/agavi/app
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/pub
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/pub
[filter:ReplaceTokens] Replaced "%%PATH_TO_AGAVI%%" with "/usr/share/php/agavi"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/pub
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/pub/modpub
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/cache
[chmod] Changed file mode on '/home/fabrice/dev/ForumPHP/agavi/app/cache' to 777
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app
[filter:ReplaceTokens] Replaced "%%PATH_TO_AGAVI%%" with "/usr/share/php/agavi"
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/config
[copy] Copying 11 files to /home/fabrice/dev/ForumPHP/agavi/app/config
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/lib
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/models
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/templates
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/lib/action
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/lib/action
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/lib/model
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/lib/model
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/lib/view
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/lib/view
Modules for your project (no whitespace, comma seperated) [Default]?
[foreach] Calling Buildfile '/usr/share/php/agavi/build.xml' with target 'buildmodule'
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > buildmodule:
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/config
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/config
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/models
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
[mkdir] Created dir: /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
Actions for Default (no whitespace, comma seperated) [Index]?
[foreach] Calling Buildfile '/usr/share/php/agavi/build.xml' with target 'buildaction'
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > buildaction:
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Index"
Views for Index (no whitespace, comma seperated) [Success,Error]?
[foreach] Calling Buildfile '/usr/share/php/agavi/build.xml' with target 'buildview'
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > buildview:
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Index"
[filter:ReplaceTokens] Replaced "%%VIEW%%" with "Success"
[filter:ReplaceTokens] Replaced "%%ACTION%%" with "Index"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
[foreach] Calling Buildfile '/usr/share/php/agavi/build.xml' with target 'buildview'
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > buildview:
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Index"
[filter:ReplaceTokens] Replaced "%%VIEW%%" with "Error"
[filter:ReplaceTokens] Replaced "%%ACTION%%" with "Index"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
Models for Default (no whitespace, comma seperated)?
[phingcall] Calling Buildfile '/usr/share/php/agavi/build.xml' with target 'defaultactions'
[property] Loading /home/fabrice/dev/ForumPHP/agavi/build.properties
[property] Unable to find property file: /home/fabrice/dev/ForumPHP/agavi/build.properties... skipped
agavi > defaultactions:
Project dir: /home/fabrice/dev/ForumPHP/agavi
Module of Default Action? (Default) [Default]?
Name of Default Action? (Index) [Index]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "WelcomeToAgavi"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "WelcomeToAgavi"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/pub
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/pub
404 error module? (Default) [Default]?
404 error action (use an existing or create a new)? (Index,WelcomeToAgavi) [Error404]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Error404"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Error404"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
Login module? (Default) [Default]?
Login action (use an existing or create a new)? (Index,WelcomeToAgavi,Error404) [Login]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Login"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Login"
Secure module? (Default) [Default]?
Secure action (use an existing or create a new)? (Index,WelcomeToAgavi,Error404,Login) [Secure]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Secure"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Secure"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
Module Disabled module? (Default) [Default]?
Module Disabled action (use an existing or create a new)? (Index,WelcomeToAgavi,Error404,Login,Secure) [ModuleDisabled]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "ModuleDisabled"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "ModuleDisabled"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
Unavailable module? (Default) [Default]?
Unavailable action (use an existing or create a new)? (Index,WelcomeToAgavi,Error404,Login,Secure,ModuleDisabled) [Unavailable]?
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/actions
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Unavailable"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/views
[filter:ReplaceTokens] Replaced "%%MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%ACTION_NAME%%" with "Unavailable"
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/modules/Default/templates
[copy] Copying 1 file to /home/fabrice/dev/ForumPHP/agavi/app/config
[filter:ReplaceTokens] Replaced "%%DEFAULT_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%DEFAULT_ACTION%%" with "Index"
[filter:ReplaceTokens] Replaced "%%404_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%404_ACTION%%" with "Error404"
[filter:ReplaceTokens] Replaced "%%LOGIN_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%LOGIN_ACTION%%" with "Login"
[filter:ReplaceTokens] Replaced "%%DISABLED_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%DISABLED_ACTION%%" with "ModuleDisabled"
[filter:ReplaceTokens] Replaced "%%SECURE_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%SECURE_ACTION%%" with "Secure"
[filter:ReplaceTokens] Replaced "%%UNAVAILABLE_MODULE%%" with "Default"
[filter:ReplaceTokens] Replaced "%%UNAVAILABLE_ACTION%%" with "Unavailable"
BUILD FINISHED
Total time: 44.4760 seconds
fabrice@kimsufi:~/dev/ForumPHP/agavi$
Si tout s'est bien déroulé, dans le répertoire doivent se trouver deux nouveaux répertoires :
Il suffit de rendre accessible le repertoire pub au serveur web en executant les commandes suivantes par exemple :
fabrice@kimsufi:~/dev/ForumPHP/agavi$ cd /var/www fabrice@kimsufi:/var/www$ sudo ln -s /home/fabrice/dev/ForumPHP/agavi/pub ForumPHP [sudo] password for fabrice: fabrice@kimsufi:/var/www$
Et de lui permettre d'écrire dans le répertoire cache de Agavi
fabrice@kimsufi:~ sudo chmod a+rw /home/fabrice/dev/ForumPHP/agavi/app/cache
Nous avons maintenant la page d'acceuil d'une application Agavi vierge de disponible sur le serveur à l'adresse http://www.coredmp.net/ForumPHP-V1.0
Les sources sont téléchargeable ici : forumphp-v1.00.01.tar.gz
Nous allons modifier la configuration d'agavi afin d'afficher un petit message.
Agavi, utilise par défaut un système de routing, renvoyant à la page d'accueil. Pour annuler ce système il faut modifier le fichier routing.xml situé dans le répertoire agavi/app/config en retirant ligne qui affiche la page de bienvenue. On obtient donc :
<?xml version="1.0" encoding="UTF-8"?>
<configurations xmlns="http://agavi.org/agavi/1.0/config">
<configuration>
<routes>
<route pattern="^/$" module="%actions.default_module%" action="%actions.default_action%" />
</routes>
</configuration>
</configurations>
Maintenant, si vous affichez la page de votre application, celle-ci doit être blanche. Il est temps de faire une petite introduction au modèle MVC de Agavi
Agavi est un framework MVC (Modèle-Vue-Contrôleur). Il fournit toute la mécanique nécessaire pour gérer ce genre d'application. Les grands principes sont :
L'utilisateur intéragit avec l'application à travers des actions. Ces actions peuvent être, des clics ou des des mouvements de la souris, des données saisie au clavier, etc.
Chaque action possible de l'utilisateur va entraîner l'exécution d'une Classe Action sur le serveur d'application.
L'objet en charge de l'envoi des actions aux bonnes classes, dans le bon ordre est le Contrôleur. Vous n'avez à priori jamais à écrire quoique ce soit pour lui. Il fait partie intégrante d'Agavi. Et il est capable de toujours trouver une action à exécuter en fonction de ce que l'utilisateur a fait (en partie grâce au fichier de configuration routing.xml).
C'est dans ces actions et uniquement dans celles-ci, que le modèle de données doit évoluer. Elles ne provoquent aucun affichage et ne font que des traitements. Il est possible qu'il n'y ait aucun traitement à faire, c'est d'ailleurs le cas dans la plupart des actions. Il est par contre indispensable à la fin de chaque action de déterminer quelle Vue le contrôleur doit afficher.
Les vues sont les objets chargés de présenter les informations contenus dans le modèle. Ces vues peuvent les présenter sous forme d'HTML, de XML, de Graphisme, etc… Par contre, il est primordial qu'à aucun moment une vue ne modifie le modèle lui-même. Elle ne peut que l'interroger pour récupérer des informations.
Agavi organise l'arborescence et les noms des classes en fonction de leur type.
Une action se trouvera dans le répertoire action et aura comme nom de fichier LenomdelaclassAction.class.php. Le nom de la classe n'est pas libre non plus, elle doit forcément s'appeler LenomdelaclasseActionClass. Le même principe est appliqué pour les vues.
Donc, après cette très rapide présentation, nous allons modifier ce qui concerne la page d'index pour afficher un petit message et une information sur la connexion à notre base de données.
C'est clairement un traitement, nous allons donc le faire dans l'action de la page d'index : app/modules/Default/action/IndexAction.class.php.
Pour cela on va commencer par récupérer un context au-près du framework Agavi, on lui demandera ensuite un accès au gestionnaire de bases de données et enfin, nous interrogerons ce dernier afin d'obtenir une connexion vers cette base. Puisque pour le moment nous n'avons pas configuré de connexion, nous devrions logiquement obtenir une erreur.
<?php
class Default_IndexAction extends ProjectBaseAction
{
public function executeRead(AgaviRequestDataHolder $rd) {
/* On demande le contexte d'execution */
$context=$this->getContext();
/* On demande maintenant le databasemanager, s'il existe */
$databasemanager=$context->getDatabaseManager();
if($databasemanager) {
/* On demande finalement une connexion sur la base de donnees par default */
$dbc = $databasemanager->getDatabase();
} else {
$dbc = "";
}
/*
Si dbc est null, nous n'avons pas de connection active, on renseigne alors
l'information qui sera transmise a la vue
*/
if($dbc) {
$rd->setParameter("DBOK","Oui");
} else {
$rd->setParameter("DBOK","Non");
}
return "Success";
}
/**
* This method returns the View name in case the Action doesn't serve the
* current Request method.
*
* !!!!!!!!!! DO NOT PUT ANY LOGIC INTO THIS METHOD !!!!!!!!!!
*
* @return mixed - A string containing the view name associated with this
* action, or...
* - An array with two indices:
* 0. The parent module of the view that will be executed.
* 1. The view that will be executed.
*
*/
public function getDefaultViewName()
{
return 'Success';
}
}
?>
Cela va se passer en deux étapes. On va récupérer l'information dans la vue et la passer au template afin de l'afficher app/modules/Default/views/IndexSuccessView.class.php
<?php
class Default_IndexSuccessView extends ProjectBaseView
{
public function executeHtml(AgaviRequestDataHolder $rd)
{
$this->setupHtml($rd);
/* On recupere l'inforamtion de $rd */
$dbstate=$rd->getParameter("DBOK");
/* On fixe sa valeur dans le template */
$this->setAttribute('_dbstate',$dbstate);
// set the title
$this->setAttribute('_title', 'Index Action');
}
}
?>
Il faut maintenant modifier le template afin d'afficher ces informations app/Default/template/IndexSucess.php
<CENTER> Ca marche !<br> Connexion à la base : <?php echo $template['_dbstate']; ?> <br> </CENTER>
Maintenant vous devez avoir cette page d'affichée :
Nous allons la laisser comme ça pour le moment et passer à la configuration de la base de donnée et de Propel.
Les sources sont téléchargeables : forumphp-v1.04.01.tar.gz
Je détaillerai plus tard la configuration d'Agavi et son fonctionnement.
| Page précédente : Conception de la base | Document principal | Page suivante : Génération de la base |