我有一个带有字符串实体属性的 Symfony2 应用程序。根据其他属性的值,此字符串可以表示另一个实体的 ID、日期或任何随机字符串。
我的问题是属性代表另一个实体的 ID 的情况。由于我的关联表单(大概)假定获取实体而不是字符串,因此表单字段(在本例中为可用实体的下拉列表)不能正确反映存储在数据库中的值,这意味着它始终默认为第一个列表中的项目。
如何让表单理解属性的值是实体 ID(在这种情况下)?
首先是您的数据库设计方式错误。字符串属性应始终为字符串,日期属性应始终为日期,关系属性应始终为关系。这不仅可以防止混淆,还可以提高性能(因为 symfony 会生成高性能的连接查询并在适当的属性被定义为实体时使用代理类)。
在您的情况下,有一个解决方案。您可以将任何选项传递给表单类型类并动态构建不同的字段集。
SomeController.php:
public function someAction()
{
$propertyType = array();
// put here your conditions to determine property type
if (property is string)
{
$propertyType['type'] = 'string';
}
else if (property is datetime)
{
$propertyType['type'] = 'datetime';
}
else if (property is entity)
{
$propertyType['type'] = 'entity';
$propertyType['class'] = '\Acme\DemoBundle\Entity\Something';
}
$form = $this->createForm(new SomeFormType(), $someData, array('propertyType' => $propertyType));
}
SomeFormType.php:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setRequired(array(
'propertyType',
));
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$array = array('required' => true, 'label' => 'Your label');
if ($options['propertyType']['type'] == 'entity'
$array['class'] = $options['propertyType']['class']
$builder
->add('title', $options['propertyType']['type'], $array)
;
}