Blogdevphp

Héritage formulaire sous symfony2

2013-12-23 symfony

Vous serez amenés forcément, à créer des formulaires, sous symfony2. Les cas, les plus courants, seront le formulaire de connexion ou encore le formulaire de contact... Vous aurez besoin de formulaires dans un back-office, pour la gestion de produits, d'articles...

Bien souvent, on retrouve deux, trois champs ou plus, qui reviennent souvent et c'est là que l'héritage de formulaire intervient. La duplication de ces champs, peut vite devenir contraignante, dans le cas de modifications. Nous allons prendre l'exemple d'un blog, où la gestion de celui-ci se fait depuis le back-office. Ce blog présente des tutoriels sous forme d'articles et de vidéos.

Création de formulaires

Supposons que vous avez généré vos entités, nous allons passer par des formulaires pour enregistrer nos données. Les entités, sont une représentation de notre base de données, pour chaque table, sous la forme de classes. A partir, de ces entités, nous allons générer nos formulaires, qui s'enregistreront dans le dossier Form.

Dans le dossier /src, nous avons le bundle Backend avec dans le dossier /Entity, l'entité media. Le bundle Backend se trouve dans le dossier Blog.

La commande pour générer notre formulaire, à partir de notre entité :

php app/console doctrine:generate:form BlogBackendBundle:Media

Après cette commande, un fichier Media.php sera présent dans le dossier /Form. Si on regarde de plus près à ce fichier, il ressemble à ça, au niveau de la structure :

<?php
namespace Blog\BackendBundle\Form;

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

class MediaType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('titre','text')
            ->add('isVisible','checkbox')
            ->add('description','text')
        ;
    }
    
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Blog\Backend Bundle\Entity\Media'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'blog_backendbundle_media';
    }
}


?>

Nous allons agrémenter notre classe de labels et d'attributs afin que certains champs soient obligatoires :

<?php

/********/

class MediaType extends AbstractType
{
        /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('Titre', 'text', array(
                  'label' => 'Titre du média',
                  'required' => true
         )) 
            ->add('isVisible', 'checkbox', array(
                  'label' => 'Afficher le média',
                  'required' => true
                )) 
           ->add('Description', 'text', array(
                 'label' => 'Description du média'
                 )) 
        ;
    }

/*********/


?>

Ce constructeur formulaire, nous servira de base pour ceux des articles et des vidéos. 

Mise en place de l'héritage

On a défini trois champs, qui seront utilisés, pour la gestion des articles et des vidéos, à travers un formulaire. Nous allons effectuer la commande pour générer nos formulaires. Cependant, nous allons faire hériter nos classes Article et Video de la classe Media.

<?php
/*********/
class Article extends MediaType
{

 public function buildForm(FormBuilderInterface $builder, array $options)
 {
   parent::buildForm($builder, $options);
   $builder
     ->add('subTitle','text', array(
           'label' => 'Sous-titre'
     ))->add('source','text', array(
             'label' => 'Source de l\'article'
     ));
  }

/**********/
?>
<?php
/*********/
class Video extends MediaType
{

 public function buildForm(FormBuilderInterface $builder, array $options)
 {
    parent::buildForm($builder, $options);
    $builder
    ->add('videoLink','text', array(
          'label' => 'Lien de la vidéo'',
          'required' => true
    ));
 }

/**********/
?>

Nous allons avoir, les trois champs titre,isVisible et Description sur les deux formulaires sans avoir dupliqué le code.

En cas de modification d'un champ, nous n'aurions qu'a travailler avec l'entité et le contructeur de formulaire Media.

comments powered by Disqus
Copyright © 2018 blogdevphp.fr - Tous droits réservés