Avant de commencer, assurez vous que votre machine possède tous les outils nécessaires:
 - Un serveur Apache2 avec PHP 5.2.4 minimum (MAMP, WAMP, LAMP).

 - La librairie PEAR pour PHP installée.
 - La commande php doit être lancée depuis le terminal.
 - Pour les utilisateurs Windows il faut ajouter le fichier php.exe de WAMP dans les variables d'environnement.
 - Pour les utilisateurs MAC il faut s'assurer que c'est bien le bon php qui est exécuté en tapant la commande : php -v
 - Si ce n'est pas le cas il faut editer le fichier .bash_profile dans votre répertoire utilisateur et ajouter la ligne:

# edit the .bash_profile file
mac:~$ nano
.bash_profile

# add this line
PATH=/Applications/MAMP/bin/php5/bin:$PATH export PATH

 - Avoir un client svn pour récupérer les derniers dépôts des libraries opensources.
Pour les utilisateurs de WAMP, il est probable que PEAR ne soit pas installé.
Rien de plus simple, dans le répertoire PHP de WAMP il y a un fichier go-pear.bat qu'il suffit de lancer via le terminal.

I/ Créer le projet symfony.

1) Première étape, comme dans tout projet symfony, créer l'environnement du projet.

 - Ouvrez un terminal.

 - Créer le répertoire du projet et celui de la librarie symfony :

## MAC / LINUX:
  mkdir -p /projects/egallery/trunk/deploy/lib/vendor
 
## WINDOWS:
  mkdir c:\projects\egallery\trunk\deploy\lib\vendor

  - Aller dans le repertoire lib/vendor.

  - Exporter le dernier tags du projets symfony:

 Sur windows utiliser TortoiseSVN ou installer VisualSVN et créer la variable d'environnement sur le fichier svn.exe // TODO finish explain

 svn export http://svn.symfony-project.com/tags/RELEASE_1_2_8/ symfony/

- Revenir à la racine du projet :

cd ../..

- Vérifier la configuration du système:

php lib/vendor/symfony/data/bin/check_configuration.php


Le script renvoie ceci quand tout va bien:

********************************
*                              *
*  symfony requirements check  *
*                              *
********************************

php.ini used by PHP: /etc/php5/cli/php.ini

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  If this is the case, please launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        PHP version is at least 5.2.4
  OK        php.ini has zend.ze1_compatibility_mode set to off

** Optional checks **

  OK        PDO is installed
  OK        PDO has some drivers installed: mysql
  OK        PHP-XML module is installed
  OK        XSL module is installed
  OK        The token_get_all() function is available
  OK        The mb_strlen() function is available
  OK        The iconv() function is available
  OK        The utf8_decode() is available
  OK        A PHP accelerator is installed
  OK        php.ini has short_open_tag set to off
  OK        php.ini has magic_quotes_gpc set to off
  OK        php.ini has register_globals set to off
  OK        php.ini has session.auto_start set to off
  OK        PHP version is not 5.2.9


Si seulement quelques 'warning' apparaissent, ce n'est pas trop grave.
Faite les correctifs demander dans le fichier php.ini utilisé (Attention il peut y en avoir plusieurs)

Sur linux il est assez facile d'ajouter les modules manquants, c'est plus compliqué sur MAC et Windows et pas forcement nécessaire à ce stade.

Par contre si le résultat vous signale une mauvaise configuration, il faudra faire le nécessaire pour corriger le problème avant d'aller plus loin.

 - Créer la structure du projet symfony

## Pour MAC / LINUX
php lib/vendor/symfony/data/bin/symfony generate:project egallery

## Pour windows:
php lib\vendor\symfony\data\bin\symfony generate:project egallery

## On peut lister les différentes commandes de symfony en tapant:
php symfony

En ajoutant l'option -V à la fin, on peut voir le version du framework.

2) Créer l'application.

php symfony generate:app --escaping-strategy=on --csrf-secret=Unique$ecret frontend

Les 2 options --escaping-strategy et --csrf-secret sont pour la sécurité.
Pour plus de détails allez voir le projet symfony.

Cette méthode créer l'arborescence nécessaire au projet dans le répertoire apps/frontend/

3) Configurer l'application.

  - Symfony utilise une classe php pour faire les imports automatique des classes dont il a besoin.
Pour une meilleur portabilité de code il faut changer le chemin de cette classe dans le fichier config/ProjectConfiguration.class.php :

   require_once dirname(__FILE__) . '/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

 
 - Pour une meilleure gestion des projets je conseille de forcer le fichiers hosts:
  Pour Linux et MAC, il est dans le répertoire /etc/hosts
  Pour windows, il est dans le répertoire C:\WINDOWS\system32\drivers\etc\

Un fois le mode lecture seul enlevé sur Windows, ajouter cette ligne:

127.0.0.1    egallery.localhost

Note: Cette manipulation permet de créer un nom de domaine virtuellement (uniquement sur la machine).
En générale c'est comme ceci que les Admin réseau testent la migration de sites avant de basculer les DNS.

 4) Configurer le serveur:

 - Vérifier la présence et Activer si nécessaire des module mod_vhost_alias et mod_rewrite.
 - Créer le Virtual host dans Apache2:

Linux : Créer un fichier /etc/apache2/sites-enabled/egallery.conf
Mac/Win : Editer le fichier httpd.conf ou apache2.conf
On peut également créer un VirtualHost dans un fichier à part de la conf d'Apache mais je ne m'étendrais pas dessus ici.

Il faut dire à apache que la racine de l'application est dans le répertoire web/ de symfony.
Remplacer les chemins /projects/egallery/trunk/deploy/ par c:\projects\egallery\trunk\deploy\ pour windows.
<VirtualHost *:80>
  ServerName egallery.localhost
  DocumentRoot "/projects/egallery/trunk/deploy/web"
  DirectoryIndex index.php
  <Directory "/projects/egallery/trunk/deploy/web">
    AllowOverride All
    Allow from All
  </Directory>
  Alias /sf /projects/egallery/trunk/deploy/lib/vendor/symfony/data/web/sf
  <Directory "/projects/egallery/trunk/deploy/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

- Relancer Apache et tester l'URL http://
egallery.localhost
Si tout est bien configurer vous devez avoir la page d'accueil de symfony comme ceci:

II/ Développer l'application frontend


  1) Installer Doctrine 1.1

Note: Pendant tout cette partie, l'application sera inutilisable. Elle sera à nouveau opérationnelle à la fin de la configuration de la BDD (partie 2: créer la BDD).

Symfony à la possibilité d'utiliser 2 ORM pour la gestion des Models de BDD : Propel ou Doctrine.
En l'occurence depuis la version 1.2 de Symfony, de plus de en plus de developpements avec Symfony se font avec cet ORM. Fabien Potencier, le créateur de symfony, recommande également d'utiliser Doctrine.
C'est pourquoi nous allons installer le plugin de doctrine.

 - Première étape il faut désactiver complètement propel.
 - Editer la classe ProjectConfiguration dans le repertoire config
 - Remplacer cette ligne :

$this->enableAllPluginsExcept(array('sfDoctrinePlugin', 'sfCompat10Plugin'));

 - Par celle-ci:

$this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));

 - Supprimer les fichiers:

config/databases.yml
conf/propel.ini
conf/schema.yml
web/sfPropelPlugin

  - Publier à nouveau les plugins:

php symfony plugin:publish-assets

 - Résultat de la commande:

>> plugin    Configuring plugin - sfDoctrinePlugin
>> plugin    Configuring plugin - sfProtoculousPlugin

  - Vider le cache de symfony:

php symfony cc

Note: cette commande est très importante dans projet symfony, je vous conseille vivement de lire les tutorials à ce sujet ici

  2) Créer la BDD

 - Créer la BDD.

mysqladmin -uroot -p create egallery
>> Enter password: ******

Note: Changer le chemin de la commande mysqladmin avec le bon chemin selon la configuration de votre machine ou créer une une BDD en UTF8 dans phpmyadmin.

 - Configurer l'accès à la BDD dans symfony:

php symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=jobeet" root myPassSecret

- Le fichier conf/database.yml est créé:

all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=egallery'
      username: root
      password: myPassSecret

Note: Eviter de configurer un accès à la BDD avec un utilisateur root, il vaux mieux créer un utilisateur spécifique à cette BDD.

 - Créer le schéma de la BDD:

nano config/doctrine/schema.yml

# config/doctrine/schema.yml
Gallery:
  columns:
    id: { type: integer(4), primary: true, autoincrement: true }
    description: { type: string, notnull: true }
    title: { type: string(150), notnull: true }
    url: { type: string(255), notnull: true }

# create the application model
php symfony doctrine:build-model
>> doctrine  generating model classes

# create the sql structure file
php symfony doctrine:build-sql
>> doctrine  generating sql for models

# launch the sql structure file
php symfony doctrine:insert-sql
>> doctrine  created tables successfully

# build the schema
php symfony doctrine:build-schema
>> doctrine  generating yaml schema from database
>> doctrine  Generate YAML schema successfully from database

Note: Pour plus de détail sur la création et la configuration d'une BDD avec Doctrine consulter la documentation en ligne: http://www.doctrine-project.org/
Pour la configuration d'un fichier yml avec doctrine: http://www.doctrine-project.org/documentation/manual/1_1/en/yaml-schema-files.
Pour en savoir plus sur le format YAML, allez consulter cette adresse: http://yaml.org/
Plusieurs plugins eclipse existent pour prendre en charge ce format de fichier, personnellement j'utilise celui-là : YEdit

 - Créer le fichier data/fixtures/gallery.yml:

# data/fixtures/gallery.yml
gallery:
<?php for( $i = 1 ; $i <= 7 ; $i++ ): ?>
  picture_<?php echo $i ; ?>:
    description : The Picture n°0<?php echo $i ; ?>
    title : Picture 0<?php echo $i ; ?>
    url : picture/picture<?php echo $i ; ?>.jpg
<?php endfor ; ?>

Ce fichier servira à remplir la BDD.
Note : Il est possible dans un fichier .yml de

- Insérer les données dans la Base:

php symfony doctrine:data-load
>> doctrine  loading data fixtures from "/ho...ery/trunk/deploy/data/fixtures"
>> doctrine  Data was successfully loaded

Note: Il faut faire attention aux espaces dans le fichiers yml sinon la commande peut générer une erreur du genre:    


  Validation failed in class Gallery

    2 fields had validation errors:

      * 1 validator failed on title (notnull)     
      * 1 validator failed on url (notnull)       

Voire ce message:


Unable to parse string: Unable to parse line 4 (  picture_2:).    

Le problème vient du mauvais parsing du fichier yml qui ne trouve pas les champs title et url.
On peut bien s'en rendre compte en changeant le fichier schema.yml et en relançant tout le process:

# config/doctrine/schema.yml
Gallery:
  tableName: gallery
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    description:
      type: string(2147483647)
      notnull: true
    title:
      type: string(150)
      notnull: false
    url:
      type: string(255)
      notnull: false

# rebuild all the database schema
php symfony doctrine:build-all-reload
                                                       
  This command will remove all data in your database.  
  Are you sure you want to proceed? (y/N)              
                                                       

y
>> doctrine  dropping databases
>> doctrine  Successfully dropped database f...ion "doctrine" named "egallery"
>> doctrine  creating databases
>> doctrine  Successfully created database f...ion "doctrine" named "egallery"
>> doctrine  generating model classes
>> doctrine  generating sql for models
>> doctrine  Generated SQL successfully for models
>> doctrine  generating form classes
>> doctrine    /home.../base/BaseGalleryForm.class.php
>> tokens    /home.../doctrine/GalleryForm.class.php
>> tokens    /home...rine/BaseFormDoctrine.class.php
>> doctrine  generating filter form classes
>> tokens    /home...BaseGalleryFormFilter.class.php
>> tokens    /home...ine/GalleryFormFilter.class.php
>> tokens    /home...aseFormFilterDoctrine.class.php
>> doctrine  created tables successfully
>> doctrine  loading data fixtures from "/ho...ery/trunk/deploy/data/fixtures"
>> doctrine  Data was successfully loaded

En regardant les données insérées dans le BDD, on peut voir que les champs title et url ont sont vide et que les données ont été concaténées dans le champs description.

  3) Installer le plugin sfAmfPlugin

Pour comprendre ce qu'est un plugin symfony, je voie recommande de faire le tutorial jobeet en langue anglaise (il est plus complet).
On apprend cette notion lors du 20ème tuto: http://www.symfony-project.org/jobeet/1_2/Doctrine/en/20
Le plugin qui nous intéresse se trouve: http://www.symfony-project.org/plugins/sfAmfPlugin
Basé sur SabreAMF il est plus utilisé et plus stable que celui reprenant AmfPHP.
De plus, le projet AmfPHP n'est plus du tout maintenu et la question est: Est-ce qu'il est optimal d'utiliser cette encore techno dans les projets flash ? 

Nicolas Perriault, quant à lui, a publié un billet sur son blog expliquant l'installation de AmfPHP dans un projet symfony:
http://prendreuncafe.com/blog/post/2008/07/25/Partager-la-session-utilisateur-entre-Flash/Flex-et-symfony-avec-AmfPHP

L'interêt du plugin sfAmfPlugin c'est l'interaction avec l'ORM Doctrine pour faciliter la création des requête SQL.
On l'installe comme ça:

# install processing
$ php symfony plugin:install sfAmfPlugin

>> plugin    installing plugin "sfAmfPlugin"
>> sfPearFrontendPlugin Attempting to discover channel "pear.symfony-project.com"...
>> sfPearFrontendPlugin downloading channel.xml ...
>> sfPearFrontendPlugin Starting to download channel.xml (663 bytes)
>> sfPearFrontendPlugin .
>> sfPearFrontendPlugin ...done: 663 bytes
>> sfPearFrontendPlugin Auto-discovered channel "pear.symfony-project.com", alias
>> sfPearFrontendPlugin "symfony", adding to registry
>> sfPearFrontendPlugin Attempting to discover channel
>> sfPearFrontendPlugin "plugins.symfony-project.org"...
>> sfPearFrontendPlugin downloading channel.xml ...
>> sfPearFrontendPlugin Starting to download channel.xml (639 bytes)
>> sfPearFrontendPlugin ...done: 639 bytes
>> sfPearFrontendPlugin Auto-discovered channel "plugins.symfony-project.org", alias
>> sfPearFrontendPlugin "symfony-plugins", adding to registry
>> sfPearFrontendPlugin downloading sfAmfPlugin-1.4.2.tgz ...
>> sfPearFrontendPlugin Starting to download sfAmfPlugin-1.4.2.tgz (49,336 bytes)
>> sfPearFrontendPlugin ...done: 49,336 bytes
>> sfSymfonyPluginManager Installation successful for plugin "sfAmfPlugin"

# clear the cache
php symfony cc

  Nota: la version svn et le package téléchargé via PEAR n'est à priori pas la même.

  4) Créer le gateway

# the command to create the gateway module
php symfony generate:module frontend amfgateway
>> dir+      /home...tend/modules/amfgateway/actions
>> file+     /home...teway/actions/actions.class.php
>> dir+      /home...nd/modules/amfgateway/templates
>> file+     /home...eway/templates/indexSuccess.php
>> file+     /home...ntend/amfgatewayActionsTest.php
>> tokens    /home...ntend/amfgatewayActionsTest.php
>> tokens    /home...teway/actions/actions.class.php
>> tokens    /home...eway/templates/indexSuccess.php

Ensuite il faut créer l'instance du gateway dans le module.

<?php

/**
 * amfgateway actions.
 *
 * @package    egallery
 * @subpackage amfgateway
 * @author     NairuS
 * @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
 */
class amfgatewayActions extends sfActions
{
    /**
     * Executes index action
     *
     * @param sfRequest $request A request object
     */
    public function executeIndex( sfWebRequest $request )
    {
        $this->setLayout( false ) ;
       
        $gateway  = new sfAmfGateway() ;
        $response = sfContext::GetInstance()->getResponse() ;
        $response->setContent($gateway->service()) ;
        return sfView::NONE ;
    }
}
?>

Note : La méthode setLayout et la propriété sfView::NONE permettent à symfony de ne pas afficher de view lors de l'appel à cette action.
On peut donc sans crainte supprimer la view indexSuccess dans le répertoire template que la gérénation du module à créer par défaut.

5) Créer le service getGallery

# the command to create the service
php symfony amf:create-service --package=egallery/net/remoting Gallery
>> dir+      /home...services/egallery/net/remoting/
>> file+     /home...moting/GalleryService.class.php
>> tokens    /home...moting/GalleryService.class.php

L'option --package= est optionnel et permet de créer des répertoires pour classer les services.

6) Renvoyer le model de picture à afficher dans le flash.

<?php
/**
 * AMF enabled service class GalleryService
 *
 * Project: egallery
 *
 * @package   egallery.net.remoting
 * @author    NairuS
 *
 * @version SVN: $Id $
 */
class GalleryService extends sfAmfService
{
    /**
     * Returns all the Pictures of the DB
     * @return Array of PictureVO
     */
    public function getPictures()
    {
        $datas = Doctrine::getTable( 'Gallery' )->findAll() ;
        return $datas->getData();
    }
}
?>

        La commande Doctrine::getTable( 'Gallery' )->findAll() renvoie un objet Doctrine_Collection.
        La méthode getData() renvoie le tableau d'objets Doctrine_Record de la table en question.

          Note : Après toutes commandes symfony pensez a vider le cache pour forcer aussi d'Autoload des nouvelles classes ajoutées:

php symfony cc


III/ Intégrer le flash.


  1) Exporter le projet eGallery.

    - Exporter les sources du projet dans le répertoire trunk.

svn export http://astr.googlecode.com/svn/trunk/AS3/trunk/examples/egallery/advanced/trunk/ path/to/dir

    Attention : Etant donné que le répertoire trunk existe déjà, la commande ci-dessus ne fonctionnera pas. Dans ce cas, il faut l'exporter hors du projet et déplacer les sources dans le répertoire trunk.
    Le répertoire deploy doit également faire preuve d'une grande attention. Plus haut dans le tutoriel nous y avons installé le framework symfony.
    Grâce à son moteur de rooting nous faisons pointer le root du VirtualHost dans le répertoire web.
    C'est donc ici qu'il faudra y mettre les fichiers du répertoire deploy de egallery. Nous n'avons pas besoin du fichier index.html ici mais il nous servira à construire la page d'accueil du site plus tard.
   
    Nous n'avons pas besoin du tout du répertoire php qui contient amfphp puisque c'est symfony qui prendra le relais. Nous pouvons le supprimer.
    Les fichiers css doivent être déplacer du répertoire style vers le répertoire css pour que symfony puisse les prendre en compte plus tard.
    Un fois cette manipulation faite on peut supprimer le répertoire style.

    Avant de 'commiter' ces modifications vérifier qu'il n'y a pas de fichiers que vous ne voulais pas envoyer.

egallery/trunk$ svn st
?      test
?      .as3_classpath
?      src
?      bin
?      libs
?      .settings
?      deploy/test/functional/frontend/homeActionsTest.php
?      deploy/apps/frontend/modules/home
M      deploy/apps/frontend/templates/layout.php
?      deploy/web/context
?      deploy/web/locale
?      deploy/web/library
?      deploy/web/index.swf
?      deploy/web/config
?      deploy/web/css/egallery.css
?      deploy/web/css/index.css
?      deploy/web/js/swfobject.js

    Ici on peut se rendre compte qu'il y a des fichiers de eclipse et FDT qui se sont mis dans les fichiers non versionné du svn.
    Il faut les ignorer avec la commande:

svn propedit svn:ignore .

    Après l'argument svn:ignore il faut définir le chemin ou on veut ajouter des fichiers à ignorer. Dans notre cas on met un . car on se situe déjà dans le répertoire souhaité.
    Votre éditeur par défaut s'ouvre et il suffit ajouter ces lignes:

*.project
*.as3_classpath
*.settings

    Un fois que vous avez sauvegarder vous devez avoir ce résultat:

egallery/trunk$ svn propedit svn:ignore .
Nouvelle valeur définie pour la propriété 'svn:ignore' sur '.'
egallery/trunk$ svn st
M      .
?      test
?      src
?      bin
?      libs
?      deploy/test/functional/frontend/homeActionsTest.php
?      deploy/apps/frontend/modules/home
M      deploy/apps/frontend/templates/layout.php
?      deploy/web/context
?      deploy/web/locale
?      deploy/web/library
?      deploy/web/index.swf
?      deploy/web/config
?      deploy/web/css/egallery.css
?      deploy/web/css/index.css
?      deploy/web/js/swfobject.js

    C'est bon, vous pouvez envoyer les modifications sur votre dépôt.

    2) Modifier les sources pour adapter le remoting à celui de symfony.  

    2.1. Adapter l'IoC:

    Dans un premier temps, il faut changer l'appel au gateway et au service remoting.
        - Editer le fichier web/context/net/remoting/getGallery.eden et changer ces 3 lignes:

{ name : "methodName"     , value : "getPictures"               } ,
{ name : "objectEncoding" , value : 3                           } ,
{ name : "serviceName"    , value : "egallery.net.remoting.GalleryService" } ,

    Ces modifications permettent de définir le bon service remoting à appeler par le protocole AMF3.
    
        - Changer le gateway en éditant le fichier config/config.eden:

gatewayUrl   = "http://{0}/frontend_dev.php/amfgateway" ;
httphost     = "egallery.localhost" ;

    Il faut cibler l'environnement dev de symfony sinon on aura un timeout sur le remoting à tout les coups.
    Cette notation {0} permet de remplacer cette valeur par la variable httphost définit dessous grâce à la classe system.Strings de maashaack.
    
    La variable httphost sera écraser en prod par le httphost du serveur de WEB qui sera passer en flashvars par le PHP.
   
    Note: Avec le plugin que j'ai installé, je dois cibler l'environnement 'frontend_dev.php' pour que le protocole AMF puisse se faire.
Mon collègue n'a pas réussi avec cette configuration et a dû cibler l'environnement de prod pour ça.

    2.2. Adapter le remplissage du model AS3:

Le plugin sfAmfPlugin basé sur SabreAMF, permet de faire du class mapping en annotant le tag @AmfClassMapping dans le PHPDoc du service.
Dans notre cas on ne renvoie pas un objet à mapper mais une collection d'objets. Ce qui, à ma connaissance d'aujourd'hui ne fonctionne pas.
Après plusieurs tests, ce tag renvoie bien un PictureVO, seulement ce ne sont pas les enregistrements qui sont 'mappés' mais la collection.

Pour utiliser le class mapping de SabreAMF, il faudrait renvoyer de simple objet.
Par exemple on souhaitait retourner un seul PictureVO via remoting on ajouterait cette methode au service:

/**
 * Returns a Picture of the DB
 *
 * @param Integer $id
 * @return PictureVO
 * @AmfClassMapping(name="egallery.vo.PictureVO")
 */
public function getPicture( $id )
{
    return Doctrine::getTable( 'Gallery' )->find( $id )
}


Mais grâce à la puissance de l'AS3, avec son type * et l'implémentation du for ... in , nous avons la possibilité de contourner le problème.

En effet, la class vegas.vo.SimpleValueObject permet de récupérer un objet générique et de le parcourir propriété par propriété pour récupérer les valeurs qui correspondent à notre objet flash.
        Commençons par éditer le fichier egallery.net.remoting.GetGallery

# dans la méthode result remplacer la première ligne par la seconde.
model.addVO( result[i] as PictureVO ) ;
model.addVO( new PictureVO( result[i] ) ) ;

        Il faut ensuite recompiler l'application avec FDT ou autre logiciels pour les application AS3.
       

    3) Finaliser le site.

    3.1. Créer le module home pour l'accueil.

# The argument init-module is a shortcut to the generate:module command
php symfony init-module frontend home

>> dir+      /home/sfpro...s/frontend/modules/home/actions
>> file+     /home/sfpro.../home/actions/actions.class.php
>> dir+      /home/sfpro...frontend/modules/home/templates
>> file+     /home/sfpro...home/templates/indexSuccess.php
>> file+     /home/sfpro...al/frontend/homeActionsTest.php
>> tokens    /home/sfpro...al/frontend/homeActionsTest.php
>> tokens    /home/sfpro...home/actions/actions.class.php
>> tokens    /home/sfpro...home/templates/indexSuccess.php

    3.2. Intégrer les CSS et JS.

    - Editer le fichier config/view.yml:

# ajouter les css et js dans les propriétés suivantes:

stylesheets:    [main.css, index.css, egallery.css]
 
javascripts:    [swfobject.js]

    3.3. Modifier les templates

    - Supprimer le doctype dans le layout principal dans le fichier apps/frontend/templates/layout.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

        Cette balise, pour raison que j'ignore encore, empêche l'affichage du swf à 100%.
        Je l'ai donc supprimé pour afficher le swf en 100%.

        Note: on a la possibilité avec symfony de créer d'autre layout et de les charger dans n'importe quelles views avec les fichiers YML.

   - Ecrire dans le template indexSuccess.php:

<script language="JavaScript" type="text/javascript">
    var flashvars  =
    {
       httphost: "<?php echo $_SERVER['HTTP_HOST'] ; ?>"
    } ;
    
    var params =
    {
        allowScriptAccess : "sameDomain"  ,
        bgcolor           : "#666666"  ,
        quality           : "high"
    } ;
    
    var attributes =
    {
        align : "middle"
    } ;
    swfobject.embedSWF("/index.swf", "application", "100%", "100%", "9.0.124", false, flashvars, params, attributes );
</script>
<div id="application">
    <a href="http://www.adobe.com/go/getflashplayer">
        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
    </a>
</div>


   3.3. Créer le rooting vers la page d'accueil.

    - Editer le fichier apps/frontend/config/routing.yml et  remplacer par ce code:

# default rules
homepage:
  url:   /
  param: { module: home, action: index }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/*


    - Faire un clear-cache pour que symfony puisse prendre en compte le nouveau routing.
Ce tuto est également disponible en google doc public:  http://docs.google.com/View?id=ddqrq3hp_59d66w6zgk
Dans les sources du projet je n'ai pas mis le framework Vegas mais les sources sont disponible ici.