Bonjour a tous
j'ai une probleme avec ma twig interface puisque je veux aficher mon entity manytomany sous form d'un table avec un selectbox
mon code est le suivant:
Entity Patient :

<?php

namespace Pediatrie\PediatrieBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * Patient
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Pediatrie\PediatrieBundle\Entity\PatientRepository")
 */
class Patient 
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

  /**
     * @var string
     *
     * @ORM\Column(name="Nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="Prenom", type="string", length=255)
     */
    private $prenom;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="Date_Naissance", type="date")
     */
    private $dateNaissance;

     /**
   * @ORM\ManyToMany(targetEntity="Pediatrie\PediatrieBundle\Entity\Allergie", cascade={"persist"})
    * @ORM\JoinTable(name="Attaque_Allergies")
   */
    private $allergies;

    public function __construct()
    {
           $this->allergies = new \Doctrine\Common\Collections\ArrayCollection();

    }

    /**
    *
    * @param Pediatrie\PediatrieBundle\Entity\Allergie $allergies
    */
  public function addAllergie(\Pediatrie\PediatrieBundle\Entity\Allergie $allergies)
  {
    $this->allergies[] = $allergie;
  }

  /**
    *
    * @param Pediatrie\PediatrieBundle\Entity\Allergie $allergies
    */
  public function removeAllergie(\Pediatrie\PediatrieBundle\Entity\Allergie $allergie) // removeCategorie sans « s » !
  {
    // Ici on utilise une méthode de l'ArrayCollection, pour supprimer la catégorie en argument
    $this->allergies->removeElement($allergie);
  }

  /**
    *
    * @return Doctrine\Common\Collections\Collection
    */
  public function getAllergies() 
  {
    return $this->allergies;
  }
}

Entity Allergie:

<?php

namespace Pediatrie\PediatrieBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Allergie
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Pediatrie\PediatrieBundle\Entity\AllergieRepository")
 */
class Allergie
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="Nom", type="string", length=255)
     */
    private $nom;

    /**
     * @var string
     *
     * @ORM\Column(name="Type", type="string", length=255)
     */
    private $type;

    /**
     * @var string
     *
     * @ORM\Column(name="Description", type="text")
     */
    private $description;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set nom
     *
     * @param string $nom
     * @return Allergie
     */
    public function setNom($nom)
    {
        $this->nom = $nom;

        return $this;
    }

    /**
     * Get nom
     *
     * @return string 
     */
    public function getNom()
    {
        return $this->nom;
    }

    /**
     * Set type
     *
     * @param string $type
     * @return Allergie
     */
    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

    /**
     * Get type
     *
     * @return string 
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Allergie
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

}

Ma PatientType :

<?php

namespace Pediatrie\PediatrieBundle\Form;

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

class PatientType extends AbstractType {

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder

                ->add('nom', 'text', array('label' => 'Nom : ', 'required' => true))
                ->add('prenom', 'text', array('label' => 'Prénom : ', 'required' => true))
                ->add('dateNaissance', 'date', array('label' => 'Date naissance : ', 'required' => true))
                ->add('allergies', 'entity', array(
                'class' => 'Pediatrie\PediatrieBundle\Entity\Allergie',
                'property' => 'label',
                'multiple' => true,
                'expanded' => false
              ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Pediatrie\PediatrieBundle\Entity\Patient'
        ));
    }

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

}

Mais au niveau de twig je comprend pas comment faire afficher mon interface des allergies sous la forme suivant :

Merciiiiiii d'avance.

2 réponses


Tu peux expliquer plus en détail ?
"j'ai une probleme avec ma twig interface puisque je veux aficher mon entity manytomany sous form d'un table avec un selectbox
mon code est le suivant:"

Afficher une entité ? Ok, suffit de la récupérer.
ManyToMany dans twig ? Ou est la difficulté ?

{{ ma.variable }}

Selectbox ? On est dans un form ou dans un rendu de données récupérées ?
Tu veux faire un select box entity ?

Tu comprends où je veux en venir ?

LordSpock a raison. D'ailleurs on ne voit pas l'image qui montre comment tu veux afficher tes données. Formulaire ou juste un display data?

Pour ma part, quand je souhaite afficher mes données de ManyToMany, dans un tableau HTML dans twig par exemple je procède comme ceci:
admettons que j'ai une entité batiments.php, une entité typesactivite.php, relié par une relation ManyToMany. En gros cela veut dire qu'un batiment peut avoir plusieurs types d'activité et vice versa. Dans une base de données MySQL par exemple, j'aurai une table de pivot. Avec Doctrine riaosnne en objet, tout en gardant en tête cette notion de table de pivot sans pour autant s'axer que sur cette logique.

Dans un controller j'appelle mon entité batiment:

public function indexAction() {

        $em=$this->getDoctrine()->getManager();
        $bat = $em->getRepository('MySpaceMyBundle:Batiments')->findAll();

        return $this->render('MySpaceMyBundle:Batiments:index.html.twig', array('batiments' => $bat ));
    }

dans ma twig je veux faire apparaître un tableau où certains champs de mon entité vont être affichées:

       <table>
          <thead>
            <tr>
              <th>Ref</th>
              <th>Type Activité(s)</th>
              <th>Nom du Bâtiment</th>
            </tr>
          </thead>
          <tbody>
            {% for batiment in batiments %}
              <tr>
                <td>{{ batiment.reference }}</td>

                <td>
                  {% for batiment in batiment.typesactivite %}
                    {{ batiment.type }}
                    <br>
                  {% endfor %}
                </td>

                <td>{{ batiment.nom }}</td>
              </tr>
            {% endfor %}
          </tbody>
        </table>

J'ai bien espacé lors de l'appel pour typesactivité pour que tu comprennes. En fait il faut faire une loop, car pour chaque batiment il y a 0 ou plusieurs résultats, c'est donc un tableau.
batiments.php ->ManyToMany<-typesactivite.php: en toute logique si ton model est bien construit tu dois avoir la variable étrangère dans chaque entité. Pour avoir accès sur le champ type de mon entité typesactivite.php je fais une boucle for sur batiments.typesactivite pour avoir le champs type et donc tous les types liées à mon batiments. J'espère t'avoir aidé. N'oublie pas dans chaque entités tu dois avoir la fonction __toString())

Enfin pour ton formulaire si tu veux changer l'attribut css ou html de ton champ tu peux rajouter quelque chose comme ça afin d'avoir ce que tu souhaites:

             <div>
                {{ form_label(form.batiments, "Appartenant au bâtiment:", {'label_attr': {'class': 'control-label'}}) }}
                {{ form_errors(form.batiments) }}
                {{ form_widget(form.batiments, {'attr': {'class': 'form-control'}}) }}
              </div>

Comme tu peux le voir j'ai mis la classe form-control de bootstrap sur mon champ du formulaire bâtiments qui me renvoit une liste déroulante où apparaît tous les noms de mes bâtiments.