繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM