![](/img/trans.png)
[英]Symfony2 Form Builder -> access entity property/form value for suffix
[英]Symfony2 form not correctly representing stored property value
我有一个带有字符串实体属性的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)
;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.