Symfony2设置默认select字段select

我正在以下面的方式创build一个表单:

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

我如何设置物种列表框的默认值?


谢谢你的回应,我很抱歉,我想我应该改说我的问题。 一旦我有从模型中检索的值,如何将该值设置为SELECTED =“yes”作为物种select列表中的相应值?

所以,从TWIG视图中select选项输出将如下所示:

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

如果使用Cristian的解决scheme,则需要将EntityManager注入到FormType类中。 这是一个简单的例子:

 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) )); } } 

和你的控制器:

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

从学说Docs :

EntityManager#getReference($ entityName,$ identifier)方法可以让您获得对已知标识符的实体的引用,而不需要从数据库中加载该实体。 例如,当您想要build立与您拥有该标识符的实体的关联时,这是非常有用的。

您可以从“数据”属性中定义默认值。 这是摘要“字段”types的一部分( 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(); 

在这个例子中,“Draft”将被设置为默认的选定值。

解决scheme:对于types实体使用选项“数据”,但值是一个对象。 即:

 $em = $this->getDoctrine()->getEntityManager(); ->add('sucursal', 'entity', array ( 'class' => 'TestGeneralBundle:Sucursal', 'property'=>'descripcion', 'label' => 'Sucursal', 'required' => false, 'data'=>$em->getReference("TestGeneralBundle:Sucursal",3) )) 

我想你应该简单地使用$breed->setSpecies($species) ,例如在我的表单中我有:

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

并将我的默认select设置为当前date。 应该以相同的方式为外部实体工作…

如果你想传入一个Doctrine实体的数组,试试像这样(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, ]); } 

我不确定你在做什么错在这里,当我使用表单类build立一个表单Symfony负责在列表中select正确的选项。 下面是我的一个表单的例子。

在编辑操作的控制器中:

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

活动实体types类(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'; } } 

从文档:

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

混合$ data = null是默认选项。 所以例如我有一个名为状态的字段,我这样实现:

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

设置symfony2单选button的默认选项

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

表单应该自动将species-> id值映射到选定的实体select字段。 例如,如果您的Breed实体在名为“breed_species”的连接表中与物种实体具有OnetoOne关系,那么:

 class Breed{ private $species; /** * @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed") */ private $breedSpecies; public function getSpecies(){ return $breedSpecies->getSpecies(); } private function getBreedSpecies(){ return $this->$breedSpecies; } } 

表单类中的字段“species”应该从传递给表单的Breed类中的“species”属性对象中选取species-> id值。

或者,您可以通过使用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() ) ); 

我不认为你应该使用data选项,因为这不仅仅是设置一个默认值。 您也正在重写在创build过程中传递给表单的任何数据。 所以基本上,你打破了对这个function的支持。 – 当你让用户创build数据时,这可能并不重要,但是当你想要(某天)使用表单来更新数据时,这一点很重要。

请参阅http://symfony.com/doc/current/reference/forms/types/choice.html#data

我相信在表单创build过程中传递任何默认数据会更好。 在控制器中。

例如,您可以传入一个类并在类中定义默认值。 (使用默认的Symfony\Bundle\FrameworkBundle\Controller\Controller

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

或者在使用对象时:

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

使用工厂时更好(狗可能从动物身上延伸)

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

这将使您能够将表单结构和内容彼此分开,并使表单在更多情况下可重用。


或者,使用preferred_choices选项,但是这会将默认选项移动到表单顶部。

请参阅: 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 ] ); 

您可以使用此表单将正确的默认值定义到要编辑的模型中,也可以指定empty_data选项,以便代码变为:

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

您可以使用“preferred_choices”并将您想要select的名称“推”到列表顶部。 然后它会被默认选中。

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

实体字段types