Créer une requête SQL native dans Symfony2 avec Doctrine2

Il peut être intéressant voir obligatoire dans certains cas complexes d’avoir recours aux requêtes SQL native directement dans Symfony2, tout en passant par l’ORM et en récupérant des objets à la suite de cette requête.

Voici un exemple d’utilisation dans un Repository Symfony2:

use Doctrine\ORM\Query\ResultSetMapping;
$rsm = new ResultSetMapping();
$rsm->addEntityResult('Novaway\Bundle\CmsBundle\Entity\Project', 'p');
$rsm->addFieldResult('p', 'id', 'id');
$rsm->addFieldResult('p', 'title', 'title');

$sql = 'SELECT p.id, p.title FROM project p JOIN project_related pr ON p.id = pr.related_project_id WHERE pr.project_id = ?';

$query = $this->_em->createNativeQuery($sql, $rsm);
$query->setParameter(1, $idProject);

$projects = $query->getResult();

Récupérer l’ID d’un objet dans un Form\Type Symfony2 pour le QueryBuilder Doctrine

Il peut vous arriver d’avoir besoin de connaître l’ID de l’objet édité dans un formulaire, et ce directement dans la classe xxxType.php (La classe de votre formulaire).

Voilà comment récupérer dans un premier temps l’ID de l’objet dans la méthode buildForm (dans notre exemple il s’agit d’un objet Tag):

public function buildForm(FormBuilder $builder, array $options)
{
$idTag= $builder->getData()->getId();

Une fois récupéré, il est possible de le passer dans le Query Builder Doctrine de la manière suivante:

$builder->add('parent', 'entity', array(
'class' => 'Novaway\\CmsBundle\\Entity\\Tag',
'query_builder' => function(EntityRepository $er) use ($idTag)
{
$qb = $er->createQueryBuilder('t')
->where('t.parent IS NULL');

if (!is_null($idTag)) {
$qb->where('t.id != :id')
->setParameter('id', $idTag);
}

return $qb->orderBy('t.title', 'ASC');
},
'required' => false,
'empty_value' => '= Parent ='
));

Voilà une astuce bien pratique pour afficher du contenu plus avancé dans les widgets entity par exemple.

Twig: Donner une couleur de fond à vos cellules de tableau pair et impair

Lorsque nous générons des tableaux, il est plus facile de lire les données d’une ligne en changeant de couleurs entre la position pair et impaire. Voici comment le faire dans vos templates twig:

{% for record in records %}
<tr class="{% if loop.index is divisibleby(2) %}odd{% else %}even{% endif %}">
...
</tr>
{% endfor %}

Il vous reste maintenant à déclarer les 2 styles (odd, even) dans votre feuille css.

Twig: accès aux éléments, variables et constantes dans Symfony2

Voici une liste non exhaustive des éléments accessibles dans vos modèles twig

  • app.security
    • .token
      • .key
      • .user
      • .roles
      • .authenticated
      • .attributes
    • .alwaysAuthenticate
  • app.user (entity User)
  • app.request
    • .attributes
    • .query
    • .server
    • .files
    • .cookies
    • .headers
    • .content
    • .languages
    • .charsets
    • .acceptableContentTypes
    • .pathInfo
    • .requestUri
    • .baseUrl
    • .basePath
    • .method
    • .format
  • app.session
    • .locale
    • .defaultLocale
    • .saved
  • app.environment
  • app.debug

Utiliser des variables de session dans un template Twig

Si l’on souhaite appeler des variables de session à l’intérieur d’un template twig, on peut utiliser la variable globale app.session.

Exemple d’un objet Info déclaré dans un contrôleur :

$info = new Info();
$this->container->get('request')->getSession()->set('info', $info);

Pour l’appeler sa propriété titleMeta, depuis un template twig :

{{ app.session.get('info').titleMeta }}