web-dev-qa-db-fra.com

Symfony2 Définition d'une sélection de champ par défaut

Je crée 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 définir une valeur par défaut pour la liste de sélection?


Merci pour votre réponse, je m'excuse, je pense que je devrais reformuler ma question. Une fois que j'ai récupéré une valeur du modèle, comment définir cette valeur sur SELECTED = "yes" pour la valeur correspondante dans la liste de choix des espèces?

Ainsi, cette option de sélection issue de la vue TWIG apparaîtra comme ceci:

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

Si vous utilisez la solution Cristian's , vous devrez injecter le EntityManager dans votre classe FormType. 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);

// ...

De Doctrine Docs :

La méthode EntityManager # getReference ($ entityName, $ identificateur) vous permet d'obtenir une référence à une entité pour laquelle l'identificateur est connu, sans charger cette entité à partir de la base de données. Ceci est utile, par exemple, en tant qu'amélioration des performances, lorsque vous souhaitez établir une association à une entité pour laquelle vous avez l'identificateur.

58
Carrie Kendall

Vous pouvez définir la valeur par défaut à partir de l'attribut 'data'. Cela fait partie du type "champ" abstrait ( 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, "Brouillon" serait défini comme valeur sélectionnée par défaut.

109
bentidy

la solution: pour l'entité de type, utilisez l'option "data" 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)           

))

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

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

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

6
Kjir

Si vous voulez transmettre un tableau d'entités Doctrine, essayez quelque chose comme ça (Symfony 3.0+):

protected $entities;
protected $selectedEntities;

public function __construct($entities = null, $selectedEntities = null)
{
    $this->entities = $entities;
    $this->selectedEntities = $selectedEntities;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('entities', 'entity', [
        'class' => 'MyBundle:MyEntity',
        'choices' => $this->entities,
        'property' => 'id',
        'multiple' => true,
        'expanded' => true,
        'data' => $this->selectedEntities,
    ]);
}
3
Jonathan

Je ne pense pas que vous devriez utiliser l'option data, car cela ne se limite pas à la définition d'une valeur par défaut. Vous remplacez également les données transmises au formulaire lors de la création. Donc, en gros, vous ne supportez plus cette fonctionnalité. - Ce qui n'a peut-être pas d'importance lorsque vous laissez l'utilisateur créer des données, mais importe quand vous souhaitez (un jour) utiliser le formulaire pour la mise à jour des données.

Voir http://symfony.com/doc/current/reference/forms/types/choice.html#data

Je pense qu'il serait préférable de transmettre toutes les données par défaut lors de la création du formulaire. Dans le contrôleur.

Par exemple, vous pouvez transmettre une classe et définir la valeur par défaut dans votre classe elle-même. (lors de l'utilisation de la valeur par défaut Symfony\Bundle\FrameworkBundle\Controller\Controller)

$form = $this->createForm(AnimalType::class, [
    'species' => 174 // this id might be substituted by an entity
]);

Ou en utilisant des objets:

$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity

$form = $this->createForm(AnimalType::class, $dog);

Encore mieux lors de l'utilisation d'une usine: (où le chien s'étend probablement de l'animal)

$form = $this->createForm(AnimalType::class, DogFactory::create());

Cela vous permettra de séparer la structure et le contenu du formulaire et de rendre votre formulaire réutilisable dans davantage de situations.


Ou utilisez le preferred_choices, mais a pour effet secondaire de déplacer l’option par défaut en haut de votre formulaire.

Voir: http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices

$builder->add(
    'species', 
    'entity', 
    [
        'class' => 'BFPEduBundle:Item',
        'property' => 'name',
        'query_builder' => ...,
        'preferred_choices' => [174] // this id might be substituted by an entity
     ]
 );
3
Maurice

Je ne suis pas sûr de ce que vous faites de travers, lorsque je construis un formulaire à l'aide de classes de formulaire, Symfony se charge 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 l'action d'édition:

$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(),
    ));

La classe de type d'entité de campagne (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';
    }
}
2
Chris

Définition du choix par défaut du bouton radio symfony2

            $builder->add('range_options', 'choice', array(
                'choices' => array('day'=>'Day', 'week'=>'Week', 'month'=>'Month'),
                'data'=>'day', //set default value 
                'required'=>true,
                'empty_data'=>null,
                'multiple'=>false,
                'expanded'=> true                   
        ))
2
SudarP

De la docs:

public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())

mixed $ data = null sont les options par défaut. Ainsi, par exemple, j'ai un champ appelé status et je l'ai implémenté comme suit:

$default = array('Status' => 'pending');

$filter_form = $this->get('form.factory')->createNamedBuilder('filter', 'form', $default)
        ->add('Status', 'choice', array(
            'choices' => array(
                '' => 'Please Select...',
                'rejected' => 'Rejected',
                'incomplete' => 'Incomplete',
                'pending' => 'Pending',
                'approved' => 'Approved',
                'validated' => 'Validated',
                'processed' => 'Processed'
            )
        ))->getForm();
2

Le formulaire doit mapper automatiquement la valeur espèce-> id sur le champ de sélection de l'entité sélectionnée. Par exemple, si vous avez une entité Breed qui a une relation OnetoOne avec une entité Species dans une table de jointure appelée 'breed_species':

class Breed{

    private $species;

    /**
    * @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed")
    */
    private $breedSpecies;

    public function getSpecies(){
       return $breedSpecies->getSpecies();
    }

    private function getBreedSpecies(){
       return $this->$breedSpecies;
    }
}

Le champ 'espèce' dans la classe de formulaire doit extraire la valeur espèce-> id de l'objet attribut 'espèce' de la classe Race transmise au formulaire.

Vous pouvez également définir explicitement la valeur en transmettant explicitement l'entité d'espèce au formulaire à l'aide de SetData ():

    $breedForm = $this->createForm( new BreedForm(), $breed );
    $species   = $breed->getBreedSpecies()->getSpecies();

    $breedForm->get('species')->setData( $species );

    return $this->render( 'AcmeBundle:Computer:edit.html.twig'
                        , array( 'breed'     => $breed
                               , 'breedForm' => $breedForm->createView()
            )
    );
1
Onshop

Vous pouvez soit définir la bonne valeur par défaut dans le modèle que vous souhaitez modifier avec ce formulaire, soit spécifier une option empty_data afin que votre code devienne:

$form = $this
    ->createFormBuilder($breed)
    ->add(
        'species',
        'entity',
        array(
            'class'         => 'BFPEduBundle:Item',
            'property'      => 'name',
            'empty_data'    => 123,
            '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()
;
0
Herzult