Symfony2 Définition d’une sélection de champs de choix 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 puis-je définir une valeur par défaut pour la liste déroulante des espèces?


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

Donc, cette option de sélection de la vue TWIG apparaîtrait comme suit:

 Dog 

Si vous utilisez la solution de Cristian , vous devrez injecter 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->getDocsortingne()->getManager()), $entity); // ... 

De Docsortingne Docs :

La méthode EntityManager # getReference ($ entityName, $ identifier) ​​vous permet d’obtenir une référence à une entité pour laquelle l’identifiant est connu, sans charger cette entité de la firebase database. Ceci est utile, par exemple, pour améliorer les performances, lorsque vous souhaitez établir une association avec une entité pour laquelle vous avez l’identifiant.

Vous pouvez définir la valeur par défaut de l’atsortingbut ‘data’. Cela fait partie du type “field” de Abstract ( 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.

la solution: pour l’entité de type, utilisez l’option “data” mais la valeur est un object. c’est à dire:

 $em = $this->getDocsortingne()->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:

 $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 …

Si vous voulez passer un tableau d’entités Docsortingne, 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, ]); } 

Je ne suis pas sûr de ce que vous faites mal ici, lorsque je construis un formulaire en utilisant des classes de formulaire Symfony prend soin de sélectionner l’option correcte 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 Docsortingne\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'; } } 

De la documentation:

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

mixed $ data = null est les options par défaut. Donc, 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(); 

Réglage du choix par défaut pour le 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 )) 

Le formulaire doit mapper automatiquement la valeur de l’espèce -> id au champ de sélection de l’entité sélectionné. Par exemple, si vous avez une entité Breed ayant 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èces” dans la classe de formulaire doit prendre la valeur “identités” de l’object “espèce” dans la classe de race transmise au formulaire.

Alternativement, vous pouvez explicitement définir la valeur en passant explicitement l’entité species dans le formulaire en utilisant 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() ) ); 

Je ne pense pas que vous devriez utiliser l’option de data , car cela ne fait pas que définir une valeur par défaut. Vous remplacez également les données transmises au formulaire lors de la création. Donc, fondamentalement, vous brisez le support pour cette fonctionnalité. – Ce qui peut ne pas avoir d’importance lorsque vous laissez l’utilisateur créer des données, mais importe quand vous voulez (un jour) utiliser le formulaire pour mettre à jour les 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 passer une classe et définir la valeur par défaut dans votre classe. (lors de l’utilisation du fichier Symfony\Bundle\FrameworkBundle\Controller\Controller par défaut)

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

Ou lors de l’utilisation d’objects:

 $dog = new Dog(); $dog->setSpecies(174); // this id might be substituted by an entity $form = $this->createForm(AnimalType::class, $dog); 

Encore mieux quand on utilise 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 des formulaires et de rendre votre formulaire réutilisable dans plus de situations.


Ou utilisez l’option preferred_choices , mais cela 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 ] ); 

Vous pouvez soit définir la bonne valeur par défaut dans le modèle à modifier avec ce formulaire, soit spécifier une option empty_data pour 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() ; 

Vous pouvez utiliser “preferred_choices” et “pousser” le nom que vous souhaitez sélectionner en haut de la liste. Ensuite, il sera sélectionné par défaut.

 'preferred_choices' => array(1), //1 is item number 

Entité Type de champ