Symfony2表单未正确表示存储的属性值

时间:2013-06-23 14:14:26

标签: forms symfony

我有一个带字符串实体属性的Symfony2应用程序。根据其他属性的值,此字符串可以表示另一个实体的ID,日期或任何随机字符串。

我的问题是属性表示另一个实体的ID的情况。由于我的关联表单(可能)假定获取实体而不是字符串,因此表单字段(在这种情况下是可用实体的下拉列表)不能正确反映存储在数据库中的值,这意味着它始终默认为第一个列表中的项目。

如何让表单理解属性的值是实体ID(在它的情况下)?

1 个答案:

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