2011-08-23 21 views
9

¿Cómo puedo crear una lista de selección con los valores de una tabla de base de datos en Symfony 2?Symfony 2 Formulario con lista de selección

tengo 2 entidades: Estudiantes y aula con una relación ManyToOne y necesito crear un formulario con los campos folowing: nombre, apellido, edad, clase (lista de selección de las clases disponibles).

en mi formaEstudiante tengo

$builder 
     ->add('name') 
     ->add('surname') 
     ->add('age') 
     ->add('classroom', new ClassroomType()) 
    ; 

En mi Formulario Aula tengo esto:

$classrooms =$this->getDoctrine()->getRepository('UdoCatalogBundle:Classroom')->findAll(); 
    $builder 
     ->add('clasa','choice',array('choices' => array($classrooms->getId() => $classrooms->getName()))); 

consigo este error siguiente:

Fatal error: Call to undefined method Udo\CatalogBundle\Form\ClassroomType::getDoctrine() in /var/www/html/pos/src/Udo/CatalogBundle/Form/ClassroomType.php on line 13   

Kind Saludos, Cearnau Dan

+0

aquí una explicación: http://groups.google.com/group/symfony2/browse_thread/thread/ da8f72b33f9f93ba – tttony

Respuesta

24

No estoy seguro si encontraste una respuesta pero tuve que investigar un poco para resolver esto en mi propio proyecto.

La clase de formulario no está configurada para usar Doctrine como el controlador, por lo que no puede hacer referencia a la entidad de la misma manera. Lo que quiere hacer es usar el entity Field Type, que es un tipo de campo de opción especial que le permite cargar opciones desde una entidad de Doctrine cuando está tratando de hacerlo.

Bien, así que la historia corta. En vez de hacer lo que está haciendo para crear el campo de opciones, haga lo siguiente:

->add('category', 'entity', array(
    'class' => 'VendorWhateverBundle:Category', 
    'query_builder' => function($repository) { return $repository->createQueryBuilder('p')->orderBy('p.id', 'ASC'); }, 
    'property' => 'name', 
)) 

no estoy seguro de si se puede colocar la función query_builder en un repositorio o qué, estoy un poco balanceaba de un lado como yo ir. Hasta este momento, la documentación a la que he vinculado anteriormente es bastante clara sobre qué hacer. Supongo que el siguiente paso es leer en Doctrine's QueryBuilder.

Mientras que estás ahí creo que desea colocar el fragmento en el que está incrustando la forma Aula,

->add('classroom', new ClassroomType()) 

Es probable que no quiere que la gente crea sus propias aulas. A menos que lo hagas, entonces sí.

+0

Sí, el tipo de campo de la entidad es lo que necesito. – ziiweb

+0

Me acabas de ahorrar muchas horas, +1 –

0

Si las entidades se asignan, esta es una solución limpia para Symfony 2.8+ o 3+

<?php 

namespace My\AppBundle\Form\Type; 

use My\AppBundle\Entity\Student; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class StudentType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name') 
      ->add('surname') 
      ->add('age') 
      /* 
      * It will be resolved to EntityType, which acts depending on your doctrine configuration 
      */ 
      ->add('classroom'); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(['data_class' => Student::class]); 
    } 
} 
Cuestiones relacionadas