Symfony 2 – Les Champs de choix booléen avec des radios buttons

Pour représenter un choix booléen (vrai, faux) dans un formulaire en utilisant le composant de formulaire fournit avec Symfony2, il est possible d’utiliser des checkbox.
Mais des fois on veut deux champs radios, pour bien faire comprendre à l’utilisateur qu’il à le choix entre « Oui » et « Non ».

Cependant, si ce champ est obligatoire et que notre utilisateur choisit « Non » il est possible qu’il voit apparaître un joli message d’erreur l’informant que la valeur saisie n’est pas correct.

Je vous donne ici une façon simple et rapide pour avoir un choix booléen avec des radios boutons.

Dans notre exemple, nous allons utiliser l’entité doctrine suivante.
Une entité avec une propriété « estOk » qui peut être soit à « true » soit à « false »

namespace Waldo\SomeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity() 
 */
class Inscription
{
    /**
     * @ORM\Column(type="boolean")
     */
    protected $estOk;
    //[...]
}

Notre formType va se présenter comme ceci :

namespace Waldo\SomeBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class SomeForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('estOk', 'choice', array(
                    'label' => 'Êtes vous OK ?',
                    'choices' => array(1 => 'Oui', 0 => 'Non'),
                    'expanded' => true,
                    'multiple' => false,
                    'required' => true
                ));
    }
}

La magie, vient du faite de définir que la valeur de « Oui » est à 1 et non à la constante TRUE. Idem pour « Non », il faut utiliser le chiffre 0 en lieu et place de la constante FALSE.

Dans le cas ou cela ne fonctionne toujours pas, voici la manière forte :

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('estOk', 'choice', array(
                    'label' => 'Êtes vous OK ?',
                    'choices' => array(1 => 'Oui', 0 => 'Non'),
                    'expanded' => true,
                    'multiple' => false,
                    'required' => true
                ))
                ->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA, function (\Symfony\Component\Form\FormEvent $event) {
                    $data = $event->getData();
                    $data->setEstOk( $data->getEstOk() === false ? 0 : 1 );
                    $event->setData($data);
                })
     }
Tagués avec : , ,
Publié dans PHP, Symfony2

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*