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 (44 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. I am very sure about this website by which we can grab free xbox live gold codes online without any problem.

  2. I like your post

  3. Nice! I have found the required information on your site that i have been searching for. I hope your informative write-ups could help the other people as well. Our company deals in assignment help online sector and helps lots of students in writing their academic assignments. You can also opt for our writing service if you have some difficulty in writing your coursework.

  4. These should be very important points each we b developer must know. They will get the complete details about this through the post you have shared. This will make us to improve the ability to build good websites.

  5. Intéressant, je suis un vieux de la vielle en PHP, je devrais sans doute me former à ces nouveaux framework.

  6. En cherchant un peu sur internet, on trouve la solution. Merci à vous.

  7. In this editorial we've taken a gander at exceptionally straightforward uses of the Symfony 2 shape framework. In the first place, we perceived how to prepare a shape accommodation utilizing general HTML frame components imprinted in the View. At that point, we perceived how to influence the force of the Symfony shape framework to characterize frames in code with a specific end goal to process and hold of the qualities as a substance.

  8. 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.

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

  10. Merci pour le tuyau

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

  12. 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.

  13. 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é.

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

  15. 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

  16. 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.

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

  18. 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