Développement web indépendant à Montpellier

Publié le jeudi 28 novembre 2013 13:46:41

Symfony 2, FormBuilder et options/variables

Lorsque l'on génère des formulaires avec symfony2, il est courant que le formulaire puisse être différent selon les cas d'utilisation. Il s'agit là de conserver les mêmes attributs mais que les propriétés de ces attributs soient variables.

 class EntityType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $opt = $this->options;
        $builder
                ->add('name', 'text',array('required' => true))
                ->add('produit','entity')
        ;
    }
}

Cas d'utilisation : vous souhaitez que le champ "name" soit requis uniquement dans certains cas.Il n'est pas nécessaire de créer plusieurs EntityType (classe qui étant AbstractType), il suffit d'utiliser des options.

Utilisation d'options dans AbstractType

Tout d'abord, surchargez le constructeur afin de lui passer vos options en paramètre, puis récupérez vos options dans la méthode buildForm :

 class EntityType extends AbstractType
{
    public function __construct($options = null) {
        $this->options = $options;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('name', 'text',array('required' => $this->options['name_required']))
                ->add('produit','entity')
        ;
    }
}

Ensuite, lors de la création du formulaire (par exemple dans un méthode controleur), instanciez ce EntityType en lui passant le paramètre de vos options :

class SomeController extends Controller{
    // ...
    public function customAction()
    {
        // ...
        $form = $this->createForm(new EntityType(array('name_required' => true)), $entity, array(
            'action' => $this->generateUrl('custom_action'),
            'method' => 'POST',
        ));
        // ...
    }
}

QueryBuilder paramétré selon les options du FormType

Il n'est pas rare selon les cas d'avoir besoin d'un QueryBuilder différent pour le même attribut de type entity. La propriété query_builder du tableau attend un fonction anonyme (closure) qui renvoie ce QueryBuilder. En PHP, il est possible d'accéder aux variables à l'extérieur du contexte d'un fonction anonyme en utilisant le mot clé use.

Imaginons dans notre cas que l'on souhaite sélectionner les produits que de certaines catégories :

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $opts = $this->options;
    $builder
            ->add('name', 'text',array('required' => $this->options['name_required']))
            ->add('produit','entity',array(
                'class' => 'Ligams\AcmeBundle\Entity\Produit',
                'query_builder' => function($repository) use (&$opts){
                        return $repository->createQueryBuilder('p')
                                ->where('p.categorie=:categorie')
                                ->setParameter('categorie',$opts['produit_categorie']);
                }
            ));
}

Ajout de l'option dans le controleur :

 class SomeController extends Controller{
    // ...
    public function customAction()
    {
        // ...
        $form = $this->createForm(new EntityType(array('name_required' => true,'produit_categorie' => 2)), $entity, array(
            'action' => $this->generateUrl('custom_action'),
            'method' => 'POST',
        ));
        // ...
    }
}

En conclusion : inutile de trop multiplier les FormType, on peut utiliser les options :)

Notez cet article !

  • Actuellement 4 sur 5 étoiles
  • 1
  • 2
  • 3
  • 4
  • 5

Note : 4.1/5 (43 notes attribuées)

Merci d'avoir participé !

Vous avez déjà noté cette page, vous ne pouvez la noter qu'une fois !

Votre note a été changée, merci de votre participation !

Bonne résolution ! j'arrête d'alourdir mes pages avec des boutons de partage, mais vous pouvez continuer de partager :-)

Commentaires

  1. Best essa... | Best essay writing service reviews |

    this is a form builder guide where people who have no idea to build will get a good idea and you have well said with each minor steps.

  2. Thank you for this post. It is informative.

  3. Merci pour le tuyau

  4. Conserver conserver les mêmes attributs et qu'ils soient variables. Merci pour cet aide

  5. This is one of the form builder guide man of the people follows. I am sure there are lots of people still have no idea about this. After reading this they will get a clear idea about this.

  6. Informations utiles. Lucky me J'ai trouvé votre site web sans le vouloir, et je suis stupéfait pourquoi cet accident ne s'est pas produit plus tôt! Je l'ai marqué.

  7. Excellent! Cet article m'a aidé à gérer mon travail! Je souscris à vous!

  8. On dirait que vous avez écris l'article pour moi, j'ai été en train de chercher comment que le champ "name" soit requis uniquement dans certains cas, merci beaucoup pour votre tuto, bonne continuation

  9. Des informations très utiles. Pendant longtemps, la recherche de quelque chose comme ça, content d'avoir trouvé. Merci à l'auteur, je vais utiliser dans leur travail.

  10. Les paramètres pour le formtype sont vraiment utiles, je vais le réutiliser sur mon site, merci :)

  11. Bonjour, mon site développé en Symfony2 est très très long. J'hésite à changer de framework mais je ne sais pas quoi prendre. Avez-vous une idée ?
    Merci