2011-05-11 6 views
6

Dans symfony 2.0, comment créer une liste déroulante utilisant une association un-à-un dans un formulaire? Pouvez-vous mettre les bons exemples s'il vous plaît?Association en tête-à-tête?

+0

Pouvez-vous fournir plus de détails quant à ce que vous voulez? – Riley

+0

Je souhaite créer une liste déroulante à partir d'une table associée un-à-un. – Zeck

Répondre

11

Je vais essayer de répondre à votre question de la façon dont je la comprends. Disons que j'ai un objet Faculty lié à un seul objet University. Donc, dans la forme utilisée pour créer ou modifier une faculté, j'affiche une liste déroulante de toutes les universités dans la base de données et l'utilisateur en choisit une parmi elles. Il y a un type de champ Symfony spécial qui fait exactement ceci: le type d'entité. Voici le code de la méthode buildForm que j'utilise dans mon objet FacultyType utilisé pour créer la forme de la faculté:

// Application\AcmeBundle\Form\Type\FacultyType 
public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder->add('name'); 
    $builder->add('university', 'entity', array(
     // The class of the entity used as a combo box item 
     'class' => 'AcmeBundle:University', 

     // The property of the entity displaying the entity as text 
     'property' => 'name', 

     // The query builder used to populate the combo box, accepts 
     // a QueryBuilder object or a \Closure like below 
     'query_builder' => function(EntityRepository $repository) { 
      // This will return a query builder selecting all universities 
      return $repository->createQueryBuilder('u'); 
     } 
    )); 
} 

Note: Il y a d'autres propriétés qui peuvent être définies pour le type de champ de l'entité, je vous invite à prendre un coup d'oeil à ce page pour plus d'informations à ce sujet.

Rendu, cela affichera une liste déroulante avec toutes les universités que j'ai définies dans la base de données. Lorsque l'utilisateur enregistre le formulaire, l'université choisie est affectée à l'objet faculté lié au formulaire via un setter. Vous pourriez probablement afficher une liste déroulante à la place d'une liste déroulante. Si vous devez sélectionner plusieurs entités, l'option 'multiple' de l'entité de type champ peut être utile. Cela étant dit, l'exemple que j'ai montré n'est pas une relation un-à-un, mais plutôt un plusieurs-à-un pour l'objet Faculty et un un-à-plusieurs pour l'objet University. Une relation One-to-One serait quelque chose de plus comme une relation où un University a un Address unique. Dans ce cas, une liste déroulante ne serait pas utile puisque l'université ne peut avoir qu'une seule adresse, donc une sous-forme serait plus appropriée. S'il a beaucoup d'adresses, alors il devient une relation un-à-plusieurs comme la relation entre l'université et ses facultés.

Je ne sais pas si cela répondra à votre question correctement, mais j'espère que cela vous mènera à une solution finale.

Cordialement, Matt