68 votes

Symfony2 Réglage par défaut un champ de choix de sélection

Je suis entrain de créer un formulaire de la manière suivante:

$form = $this->createFormBuilder($breed)
             ->add('species', 'entity', array(
                  'class' => 'BFPEduBundle:Item',
                  'property' => 'name',
                  'query_builder' => function(ItemRepository $er){
                      return $er->createQueryBuilder('i')
                                ->where("i.type = 'species'")
                                ->orderBy('i.name', 'ASC');
                  }))
             ->add('breed', 'text', array('required'=>true))
             ->add('size', 'textarea', array('required' => false))
             ->getForm()

Comment puis-je définir une valeur par défaut pour les espèces listbox?


Je vous remercie pour votre réponse, je m'excuse, je pense que je devrais reformuler ma question. Une fois que j'ai une valeur que j'ai récupérer sur le modèle, comment puis-je configurer cette valeur comme SELECTED="oui" pour la valeur correspondante en l'espèce à la liste de choix?

Alors, que choisissez l'option de sortie de la tige de la vue apparaît comme suit:

<option value="174" selected="yes">Dog</option>

110voto

bentidy Points 561

Vous pouvez définir la valeur par défaut de la "data" de l'attribut. C'est une partie de l'Abrégé de type "champ" (http://symfony.com/doc/2.0/reference/forms/types/field.html)

$form = $this->createFormBuilder()
            ->add('status', 'choice', array(
                'choices' => array(
                    0 => 'Published',
                    1 => 'Draft'
                ),
                'data' => 1
            ))
            ->getForm();

Dans cet exemple, le "Projet" serait défini comme la valeur sélectionnée par défaut.

57voto

Carrie Kendall Points 3450

Si vous utilisez Cristian solution, vous aurez besoin d'injecter de l' EntityManager dans votre FormType classe. Voici un exemple simplifié:

class EntityType extends AbstractType{
    public function __construct($em) {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options){
         $builder
             ->add('MyEntity', 'entity', array(
                     'class' => 'AcmeDemoBundle:Entity',
                     'property' => 'name',
                     'query_builder' => function(EntityRepository $er) {
                         return $er->createQueryBuilder('e')
                             ->orderBy('e.name', 'ASC');
                         },
                     'data' => $this->em->getReference("AcmeDemoBundle:Entity", 3)
        ));
    }
}

Et votre contrôleur:

 // ...    

 $form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);

// ...

À Partir De La Doctrine Docs:

La méthode EntityManager#getReference($entityName, $identifiant) vous permet d'obtenir une référence à une entité dont l'identifiant est connu, sans avoir à charger l'entité de la base de données. Ceci est utile, par exemple, comme une amélioration de la performance, lorsque vous souhaitez créer une association pour une entité pour laquelle vous avez de l'identificateur.

23voto

la solution: pour le type d'entité utiliser l'option "données", mais la valeur est un objet. c'est à dire:

$em = $this->getDoctrine()->getEntityManager();

->add('sucursal', 'entity', array
(

    'class' => 'TestGeneralBundle:Sucursal',
    'property'=>'descripcion',
    'label' => 'Sucursal',
    'required' => false,
    'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)           

))

6voto

Kjir Points 1683

Je pense que vous devriez simplement utiliser $breed->setSpecies($species), par exemple, dans mon formulaire, j'ai:

$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);

et qui définit ma sélection par défaut à la date actuelle. Devrait fonctionner de la même manière pour les entités externes...

2voto

Chris Points 375

Je ne suis pas sûr de ce que vous faites mal ici, quand j'ai créer un formulaire à l'aide des classes de formulaire Symfony prend soin de sélectionner l'option appropriée dans la liste. Voici un exemple d'un de mes formulaires qui fonctionne.

Dans le contrôleur pour modifier l'action:

$entity = $em->getRepository('FooBarBundle:CampaignEntity')->find($id);

if (!$entity) {
throw $this->createNotFoundException('Unable to find CampaignEntity entity.');
}


$editForm = $this->createForm(new CampaignEntityType(), $entity);
$deleteForm = $this->createDeleteForm($id);

return $this->render('FooBarBundle:CampaignEntity:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));

L'entité de campagne de type classe (src: Foo\BarBundle\Form\CampaignEntityType.php):

namespace Foo\BarBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;

class CampaignEntityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
        ->add('store', 'entity', array('class'=>'FooBarBundle:Store', 'property'=>'name', 'em'=>'my_non_default_em','required'  => true, 'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.name', 'ASC');}))
        ->add('reward');
    }
    public function getName()
    {
        return 'foo_barbundle_campaignentitytype';
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X