我正在以下列方式创建表单:
$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”?
因此,TWIG视图中的选择选项输出如下所示:
<option value="174" selected="yes">Dog</option>
答案 0 :(得分:110)
您可以从'data'属性定义默认值。这是抽象“字段”类型(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();
在此示例中,“草稿”将被设置为默认选定值。
答案 1 :(得分:59)
如果使用Cristian's解决方案,则需要将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);
// ...
方法EntityManager#getReference($ entityName,$ identifier)允许您获取对已知标识符的实体的引用,而无需从数据库中加载该实体。例如,当您想要与具有标识符的实体建立关联时,这可用作性能增强。
答案 2 :(得分:23)
解决方案:对于类型实体使用选项“data”但值是一个对象。即:
$em = $this->getDoctrine()->getEntityManager();
->add('sucursal', 'entity', array
(
'class' => 'TestGeneralBundle:Sucursal',
'property'=>'descripcion',
'label' => 'Sucursal',
'required' => false,
'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)
))
答案 3 :(得分:5)
我认为你应该简单地使用$breed->setSpecies($species)
,例如我的表格:
$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);
并将我的默认选择设置为当前日期。外部实体的工作方式应该相同......
答案 4 :(得分:3)
如果你想传入一个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,
]);
}
答案 5 :(得分:3)
我认为您不应该使用data
选项,因为这不仅仅是设置默认值。
您还要覆盖在创建期间传递给表单的任何数据。所以基本上,你是破碎的
支持该功能。 - 当您让用户创建数据时可能无关紧要,但是当您使用时确实很重要
希望(有一天)使用表格来更新数据。
请参阅http://symfony.com/doc/current/reference/forms/types/choice.html#data
我相信在表单创建过程中传递任何默认数据会更好。在控制器中。
例如,您可以传入一个类并在类本身中定义默认值。
(使用默认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
]
);
答案 6 :(得分:2)
我不确定你在这里做错了什么,当我使用表单类构建表单时,Symfony负责在列表中选择正确的选项。以下是我的一个表单的示例。
在编辑操作的控制器中:
$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(),
));
广告系列实体类型类(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';
}
}
答案 7 :(得分:2)
来自文档:
public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())
mixed $ data = null是默认选项。例如,我有一个名为status的字段,我实现了它:
$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();
答案 8 :(得分:2)
设置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
))
答案 9 :(得分:1)
表单应自动将species-&gt; id值映射到选定的实体选择字段。例如,如果您的某个Breed实体与名为'breed_species'的连接表中的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-&gt; 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()
)
);
答案 10 :(得分:0)
您可以使用此表单在要编辑的模型中定义正确的默认值,也可以指定 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()
;
答案 11 :(得分:-1)
您可以使用“preferred_choices”并将要选择的名称“推”到列表顶部。然后默认选择它。
'preferred_choices' => array(1), //1 is item number