[Symfony-2] Filtrer liste d'objet depuis un Form

Default
,

Bonjour,

Je suis en train de développer une application pour gérer des photocopieurs, un photocopieur a une marque un modèle et des options (fax, etc...).

J'aimerais pouvoir filtrer les options dans un formulaire (j'y arrive dans un affichage avec des query_builder), mais je n'arrive pas a filtrer dans un formulaire (Form de symfony, donc le formulaire est externaliser).

Le photocopieur est ajouter a posteriori sans option, dans l'ihm il y a un lien pour ajouter les options a un modèle précis.

Je précise rapidement les liaisons entre les tables :

Liaison entre Photocopieur et Option N.N.

Liaison entre Option et Modèle, une option a un modèle, un modèle peut avoir plusieurs options.

Liaison entre Photocopieur et Modèle, un photocopieur a un modèle, un modèle a plusieurs photocopieurs.

Pouvez-vous m'aidez.

Je vous propose le code qui affiche toutes les options sans restriction, j'ai essayer plusieurs méthode mais je n'arrive pas a filtrer cette maudite liste d'options dans un formulaire.

La validation s'effectue depuis symfony, pas d'ajax ou autre.

[code]<?php

namespace StQuentin\ParcBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use StQuentin\ParcBundle\Entity\Photocopieur;

class OptionPhotocopieurType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('option', 'entity',
array(
'class' => 'StQuentinParcBundle:options',
'property' => 'libelleOption',
'expanded' => 'true',
'multiple' => 'true',

))
;
}

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

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

}[/code]
[code]<?php

namespace StQuentin\ParcBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**

  • Photocopieur *
  • @ORM\Table()
  • @ORM\Entity(repositoryClass="StQuentin\ParcBundle\Repository\PhotocopieurRepository")
    /
    class Photocopieur
    {
    /
    *

    • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\Modele", cascade={"persist"})
    • @ORM\JoinColumn(nullable=false) / private $modele; /*
    • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\Marque", cascade={"persist"})
    • @ORM\JoinColumn(nullable=false) / private $marque; /*
    • @ORM\ManyToMany(targetEntity="StQuentin\ParcBundle\Entity\Options", cascade={"persist"})
      */
      private $option;

      /**

      • @ORM\OneToMany(targetEntity="Utilisation", mappedBy="photocopieur", cascade={"remove", "persist"}) */

      /**

    • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\Direction", cascade={"persist"})
    • @ORM\JoinColumn(nullable=false) / private $direction; /*
    • @ORM\OneToMany(targetEntity="utilisation", mappedBy="Photocopieur"), cascade={"persist"})
      */
      protected $utilisation;

      /**

    • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\LocationAchat", cascade={"persist"})
    • @ORM\JoinColumn(nullable=false)
      */
      private $locationachat;

      /**

      • @var integer *
      • @ORM\Column(name="id", type="integer")
      • @ORM\Id
      • @ORM\GeneratedValue(strategy="AUTO") */ private $id;

      /**

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

      /**

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

      /**

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

      /**

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

      /**

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

      /**

      • Set numeroDeSeriePhotocopieur *
      • @param string $numeroDeSeriePhotocopieur
      • @return Photocopieur
        */
        public function setNumeroDeSeriePhotocopieur($numeroDeSeriePhotocopieur)
        {
        $this->numeroDeSeriePhotocopieur = $numeroDeSeriePhotocopieur;

        return $this;
        }

      /**

      • Get numeroDeSeriePhotocopieur *
      • @return string */ public function getNumeroDeSeriePhotocopieur() { return $this->numeroDeSeriePhotocopieur; }

      /**

      • Set adresseMacPhotocopieur *
      • @param string $adresseMacPhotocopieur
      • @return Photocopieur
        */
        public function setAdresseMacPhotocopieur($adresseMacPhotocopieur)
        {
        $this->adresseMacPhotocopieur = $adresseMacPhotocopieur;

        return $this;
        }

      /**

      • Get adresseMacPhotocopieur *
      • @return string */ public function getAdresseMacPhotocopieur() { return $this->adresseMacPhotocopieur; }

      /**

      • Set marque *
      • @param \StQuentin\ParcBundle\Entity\Marque $marque
      • @return Photocopieur
        */
        public function setMarque(\StQuentin\ParcBundle\Entity\Marque $marque)
        {
        $this->marque = $marque;

        return $this;
        }

      /**

      • Get marque *
      • @return \StQuentin\ParcBundle\Entity\Marque */ public function getMarque() { return $this->marque; }

      /**

      • Set modele *
      • @param \StQuentin\ParcBundle\Entity\Modele $modele
      • @return Photocopieur
        */
        public function setModele(\StQuentin\ParcBundle\Entity\Modele $modele)
        {
        $this->modele = $modele;

        return $this;
        }

      /**

      • Get modele *
      • @return \StQuentin\ParcBundle\Entity\Modele / public function getModele() { return $this->modele; } /*
      • Constructor */ public function __construct() { $this->utilisation = new \Doctrine\Common\Collections\ArrayCollection(); $this->locationachat = new \Doctrine\Common\Collections\ArrayCollection(); $this->consommation = new \Doctrine\Common\Collections\ArrayCollection(); }

      /**

      • Add utilisation *
      • @param \StQuentin\ParcBundle\Entity\utilisation $utilisation
      • @return Photocopieur
        */
        public function addUtilisation(\StQuentin\ParcBundle\Entity\utilisation $utilisation)
        {
        $this->utilisation[] = $utilisation;

        return $this;
        }

      /**

      • Remove utilisation *
      • @param \StQuentin\ParcBundle\Entity\utilisation $utilisation */ public function removeUtilisation(\StQuentin\ParcBundle\Entity\utilisation $utilisation) { $this->utilisation->removeElement($utilisation); }

      /**

      • Get utilisation *
      • @return \Doctrine\Common\Collections\Collection */ public function getUtilisation() { return $this->utilisation; }

      /**

      • Set adresseIPPhotocopieur *
      • @param string $adresseIPPhotocopieur
      • @return Photocopieur
        */
        public function setAdresseIPPhotocopieur($adresseIPPhotocopieur)
        {
        $this->adresseIPPhotocopieur = $adresseIPPhotocopieur;

        return $this;
        }

      /**

      • Get adresseIPPhotocopieur *
      • @return string */ public function getAdresseIPPhotocopieur() { return $this->adresseIPPhotocopieur; }

      /**

      • Set locationachat *
      • @param \StQuentin\ParcBundle\Entity\LocationAchat $locationachat
      • @return Photocopieur
        */
        public function setLocationachat(\StQuentin\ParcBundle\Entity\LocationAchat $locationachat)
        {
        $this->locationachat = $locationachat;

        return $this;
        }

      /**

      • Get locationachat *
      • @return \StQuentin\ParcBundle\Entity\LocationAchat */ public function getLocationachat() { return $this->locationachat; }

      /**

      • Add option *
      • @param \StQuentin\ParcBundle\Entity\Options $option
      • @return Photocopieur
        */
        public function addOption(\StQuentin\ParcBundle\Entity\Options $option)
        {
        $this->option[] = $option;

        return $this;
        }

      /**

      • Remove option *
      • @param \StQuentin\ParcBundle\Entity\Options $option */ public function removeOption(\StQuentin\ParcBundle\Entity\Options $option) { $this->option->removeElement($option); }

      /**

      • Get option *
      • @return \Doctrine\Common\Collections\Collection */ public function getOption() { return $this->option; }

      /**

      • Set numeroGPI *
      • @param string $numeroGPI
      • @return Photocopieur
        */
        public function setNumeroGPI($numeroGPI)
        {
        $this->numeroGPI = $numeroGPI;

        return $this;
        }

      /**

      • Get numeroGPI *
      • @return string */ public function getNumeroGPI() { return $this->numeroGPI; }

      /**

      • Set direction *
      • @param \StQuentin\ParcBundle\Entity\Direction $direction
      • @return Photocopieur
        */
        public function setDirection(\StQuentin\ParcBundle\Entity\Direction $direction)
        {
        $this->direction = $direction;

        return $this;
        }

      /**

      • Get direction *
      • @return \StQuentin\ParcBundle\Entity\Direction */ public function getDirection() { return $this->direction; } }[/code] [code]<?php

namespace StQuentin\ParcBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**

  • Options *
  • @ORM\Table()
  • @ORM\Entity(repositoryClass="StQuentin\ParcBundle\Repository\OptionsRepository")
    /
    class Options
    {
    /
    *

    • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\Modele", cascade={"persist"})
    • @ORM\JoinColumn(nullable=false)
      /
      private $modele;
      /
      *

      • @var integer *
      • @ORM\Column(name="id", type="integer")
      • @ORM\Id
      • @ORM\GeneratedValue(strategy="AUTO") */ private $id;

      /**

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

      /**

      • @var float *
      • @ORM\Column(name="montantOption", type="float", scale=5, nullable=true) */ private $montantOption;

      /**

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

      /**

      • Set libelleOption *
      • @param string $libelleOption
      • @return Options
        */
        public function setLibelleOption($libelleOption)
        {
        $this->libelleOption = $libelleOption;

        return $this;
        }

      /**

      • Get libelleOption *
      • @return string */ public function getLibelleOption() { return $this->libelleOption; }

      /**

      • Set montantOption *
      • @param float $montantOption
      • @return Options
        */
        public function setMontantOption($montantOption)
        {
        $this->montantOption = $montantOption;

        return $this;
        }

      /**

      • Get montantOption *
      • @return float / public function getMontantOption() { return $this->montantOption; } /*
      • Constructor */ public function __construct() { $this->locationachat = new \Doctrine\Common\Collections\ArrayCollection(); }

      /**

      • Set modele *
      • @param \StQuentin\ParcBundle\Entity\Modele $modele
      • @return Options
        */
        public function setModele(\StQuentin\ParcBundle\Entity\Modele $modele)
        {
        $this->modele = $modele;

        return $this;
        }

      /**

      • Get modele *
      • @return \StQuentin\ParcBundle\Entity\Modele */ public function getModele() { return $this->modele; } }[/code] [code]<?php

namespace StQuentin\ParcBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**

  • Modele *
  • @ORM\Table()
  • @ORM\Entity(repositoryClass="StQuentin\ParcBundle\Repository\ModeleRepository")
    /
    class Modele
    {
    /
    *

    • @ORM\OneToMany(targetEntity="Photocopieur", mappedBy="modele", cascade={"remove", "persist"})
      /
      protected $photocopieur;
      /
      *

      • @ORM\ManyToOne(targetEntity="StQuentin\ParcBundle\Entity\Marque", cascade={"persist"})
      • @ORM\JoinColumn(nullable=false) */ private $marque;

      /**

      • @var integer *
      • @ORM\Column(name="id", type="integer")
      • @ORM\Id
      • @ORM\GeneratedValue(strategy="AUTO") */ private $id;

      /**

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

      /**

      • @var float *
      • @ORM\Column(name="coutCopieConsommableCouleur", type="float", scale=5, nullable=true) */ private $coutCopieConsommableCouleur;

      /**

      • @var float *
      • @ORM\Column(name="coutCopieConsommableNoir", type="float", scale=5, nullable=true) */ private $coutCopieConsommableNoir;

      /**

      • @var float *
      • @ORM\Column(name="montantLoyer", type="float", scale=5, nullable=true) */ private $montantLoyer;

      /**

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

      /**

      • Set libelleModele *
      • @param string $libelleModele
      • @return Modele
        */
        public function setLibelleModele($libelleModele)
        {
        $this->libelleModele = $libelleModele;

        return $this;
        }

      /**

      • Get libelleModele *
      • @return string / public function getLibelleModele() { return $this->libelleModele; } /*
      • Constructor */ public function __construct() { $this->photocopieur = new \Doctrine\Common\Collections\ArrayCollection(); }

      /**

      • Add photocopieur *
      • @param \StQuentin\ParcBundle\Entity\Photocopieur $photocopieur
      • @return Modele
        */
        public function addPhotocopieur(\StQuentin\ParcBundle\Entity\Photocopieur $photocopieur)
        {
        $this->photocopieur[] = $photocopieur;

        return $this;
        }

      /**

      • Remove photocopieur *
      • @param \StQuentin\ParcBundle\Entity\Photocopieur $photocopieur */ public function removePhotocopieur(\StQuentin\ParcBundle\Entity\Photocopieur $photocopieur) { $this->photocopieur->removeElement($photocopieur); }

      /**

      • Get photocopieur *
      • @return \Doctrine\Common\Collections\Collection */ public function getPhotocopieur() { return $this->photocopieur; }

      /**

      • Add marque *
      • @param \StQuentin\ParcBundle\Entity\Marque $marque
      • @return Modele
        */
        public function addMarque(\StQuentin\ParcBundle\Entity\Marque $marque)
        {
        $this->marque[] = $marque;

        return $this;
        }

      /**

      • Remove marque *
      • @param \StQuentin\ParcBundle\Entity\Marque $marque */ public function removeMarque(\StQuentin\ParcBundle\Entity\Marque $marque) { $this->marque->removeElement($marque); }

      /**

      • Get marque *
      • @return \Doctrine\Common\Collections\Collection */ public function getMarque() { return $this->marque; }

      /**

      • Set marque *
      • @param \StQuentin\ParcBundle\Entity\Marque $marque
      • @return Modele
        */
        public function setMarque(\StQuentin\ParcBundle\Entity\Marque $marque)
        {
        $this->marque = $marque;

        return $this;
        }

      /**

      • Set coutCopieConsommableCouleur *
      • @param float $coutCopieConsommableCouleur
      • @return Modele
        */
        public function setCoutCopieConsommableCouleur($coutCopieConsommableCouleur)
        {
        $this->coutCopieConsommableCouleur = $coutCopieConsommableCouleur;

        return $this;
        }

      /**

      • Get coutCopieConsommableCouleur *
      • @return float */ public function getCoutCopieConsommableCouleur() { return $this->coutCopieConsommableCouleur; }

      /**

      • Set coutCopieConsommableNoir *
      • @param float $coutCopieConsommableNoir
      • @return Modele
        */
        public function setCoutCopieConsommableNoir($coutCopieConsommableNoir)
        {
        $this->coutCopieConsommableNoir = $coutCopieConsommableNoir;

        return $this;
        }

      /**

      • Get coutCopieConsommableNoir *
      • @return float */ public function getCoutCopieConsommableNoir() { return $this->coutCopieConsommableNoir; }

      /**

      • Set montantLoyer *
      • @param float $montantLoyer
      • @return Modele
        */
        public function setMontantLoyer($montantLoyer)
        {
        $this->montantLoyer = $montantLoyer;

        return $this;
        }

      /**

      • Get montantLoyer *
      • @return float
        */
        public function getMontantLoyer()
        {
        return $this->montantLoyer;
        }
        }
        public function ajouterPhotocopieurAction()
        {
        $photocopieur = new Photocopieur;
        $form = $this->createForm(new PhotocopieurType, $photocopieur);
        $request = $this->get('request');
        if ($request->getMethod() == 'POST') {
        $url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        $form->bind($request);
        if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($photocopieur);
        $em->flush();

        return $this->redirect($this->generateUrl('st_quentin_parc_accueilPhotocopieur'));
        }
        }
        return $this->render('StQuentinParcBundle:Parc/Photocopieur:ajoutPhotocopieur.html.twig', array(
        'form' => $form->createView(),
        ));
        }

    public function ajouterOptionPhotocopieurAction(Photocopieur $photocopieur)
    {
    $form = $this->createForm(new OptionPhotocopieurEditType(), $photocopieur);
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
    $url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    $form->bind($request);
    if ($form->isValid()) {
    $em = $this->getDoctrine()->getManager();
    $em->persist($photocopieur);
    $em->flush();

          // On définit un message flash
      $this->get('session')->getFlashBag()->add('info', 'Option du Photocopieur bien ajouté');
    
      return $this->redirect($this->generateUrl('st_quentin_parc_accueilPhotocopieur', array('id' => $photocopieur->getId())));
    }
    

    }
    [/code]