🇫🇷 Utiliser les forms virtuals avec Symfony2

Outdated article!

If it's a technical article, take care, maybe some informations are not exact anymore.
Otherwise, please keep in mind that this article was written quite a long time ago.

2012 commence tout juste (à ce propos, bonne année!) et commence plutôt bien!

J'ai été amené, il y a quelques jours, à utiliser l'attribut virtual du composant Form de symfony2. Le besoin était on ne peut plus simple: Créer un FormType adapté à nos besoins pour afficher un formulaire d'adresse. Ce dernier devant bien entendu être utilisé au sein de plusieurs entités disposant déjà des propriétés à éditer (address, city, zipcode, ...) et de leur getter / setters associés.
Partant de ce constat, Alexandre Salomé m'a proposé de créer un FormType "virtual"! Lorsque cet attribut est passé à true, le FormType créé utilisera les propriétés de l'objet parent!
Mais un exemple concret sera sans aucun doute bien plus parlant!

Nous avons donc une entité contenant entres autres, différents champs d'adresse:

<?php

namespace ...;

class Company
{
    private $name;
    private $address;
    private $city;

    public function getName()
    {
        return $this->name;
    }
    public function setName($name)
    {
        $this->name = $name;
    }

    public function getAddress()
    {
        return $this->address;
    }
    public function setAddress($address)
    {
        $this->address = $address;
    }

    public function getCity()
    {
        return $this->city;
    }
    public function setCity($city)
    {
        $this->city = $city;
    }
}

On se contentera ici de trois propriétés seulement (dont une qui ne nous sera pas utile pour notre FormType).

Passons à notre FormType:

<?php

namespace ...;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class LocalisationType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('address', 'textarea')
            ->add('city', 'text')
        ;
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'virtual' => true
        );
    }

    public function getName()
    {
        return 'localisation';
    }
}

Notez l'utilisation de l'option "virtual".
Lors du bind de votre formulaire, notre FormType étant virtuel, ce sont les propriétés de notre objet parent (ici Company) qui seront mis à jour par le PropertyPath.

Bien entendu, il s'agit d'un FormType extrèmement basique! Vous souhaiterez prabablement ajouter quelques champs supplémentaires...

Dernière chose, n'héitez pas à passer les noms des champs qui composent votre adresse en option au FormType Localisation de manière à être plus souple.

Tags: symfony2, forms, virtual