我有一个带字符串实体属性的Symfony2应用程序。根据其他属性的值,此字符串可以表示另一个实体的ID,日期或任何随机字符串。
我的问题是属性表示另一个实体的ID的情况。由于我的关联表单(可能)假定获取实体而不是字符串,因此表单字段(在这种情况下是可用实体的下拉列表)不能正确反映存储在数据库中的值,这意味着它始终默认为第一个列表中的项目。
如何让表单理解属性的值是实体ID(在它的情况下)?
答案 0 :(得分:0)
首先,您的数据库以错误的方式设计。字符串属性应始终为字符串,日期属性应始终为日期,关系属性应始终为关系。这不仅可以防止混淆,还可以提高性能(因为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)
;
}