Table des matières

Contrôleur

Savoir s'il s'agit d'une requête Ajax :

$this->get('request')->isXmlHttpRequest()

Ressources liées (JS, CSS, images, etc)

Les placer dans le sous-répertoire Resources/public/ du Bundle (avec éventuellement d'autres sous-répertoires).

Et côté Twig, les référencer par :

href="{{ asset('@NomDuBundle/Resources/public/...') }}"

Pour les fichiers JS et CSS, on peut déclarer ces fichiers annexes d'un coup, sous formes de tableau et/ou employer un motif type glob :

{% javascripts
    '@AcmeFooBundle/Resources/public/js/thirdparty/jquery.js'
    '@AcmeFooBundle/Resources/public/js/*'
%}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}
{% stylesheets
    '@AcmeFooBundle/Resources/public/main.css'
    '@AcmeFooBundle/Resources/public/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Leur copie/déploiement se fait avec la commande :

php app/console assets:install web
# en dev ?
php app/console assetic:dump

Modèle

Définir ses propres méthodes de requêtage :

Créer son repository dans src/application/bundle/Repository/XRepository.php Exemple :

<?php
namespace NomApplication\NomBundle\Repository;
 
use Doctrine\ORM\EntityRepository;
 
class XRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery('SELECT x FROM NomApplication\NomBundle\Entity\X x ORDER BY x.nom ASC')
            ->getResult();
    }
}

Puis faire le lien au niveau de l'entité par une annotation, src/application/bundle/Entity/X.php :

@ORM\Entity(repositoryClass="NomApplication\NomBundle\Repository\XRepository")

(commentaire avant la classe)

Mettre à jour les tables :

cd .../Symfony
php app/console doctrine:schema:update --force

Vue (Twig)

Créer un lien relatif (a) : path

{{ path('<nom de la route telle que définie dans routing.yml>', { 'param1': 'valeur1', 'param2': 'valeur2' }) }}

Pour un lien absolu, utiliser la fonction url.

Inclure des css, image, js, etc : asset

{{ asset('css/style.css') }}

Affichage en fonction du rôle de l'utilisateur : is_granted

{% if is_granted('ROLE_ADMIN') %}
<!-- Je suis Administrateur -->
{% endif %}

Alterner les classes/couleurs lors d'un for Twig :

<table>
    {% for element in collection %}
    <tr class="{{ cycle(['even', 'odd'], loop.index) }}">
        <td>{{ element.name }}</td>
    </tr>
    {% endfor %}
</table>

Messages flash

À définir dans le contrôleur :

$this->get('session')->setFlash('notice', 'Congratulations, your action succeeded!');

L'afficher dans la vue (Twig) :

{% if app.session.hasFlash('notice') %}
    <div class="flash-notice">{{ app.session.flash('notice') }}</div>
{% endif %}

Installer Symfony2

Versionner son projet Symfony2 avec Mercurial

Dans l'autre sens, il suffit de hg clone (avec . en destination - le répertoire doit être vide) puis d'installer Symfony (sans écraser les fichiers existants).

Doctrine, PostgreSQL et types date/heure

Comme expliqué dans la documentation de Doctrine, à moins de remapper ces types pour Doctrine, il ne faut pas conserver les microsecondes. Ainsi :