Php 其他实体选择列表形式

Php 其他实体选择列表形式,php,jquery,forms,symfony,Php,Jquery,Forms,Symfony,我是新来的。我在表单中有一个下拉列表,其中包含从DB获取的数据 $builder->add('category', 'entity', array( 'label' => 'category', 'class' => 'MyBundle:category', 'expanded' => false, 'multiple' => false, 'mapped' => false,

我是新来的。我在表单中有一个下拉列表,其中包含从DB获取的数据

$builder->add('category', 'entity', array(
        'label' => 'category',
        'class' => 'MyBundle:category',
        'expanded' => false,
        'multiple' => false,
        'mapped' => false,
        'empty_value' => 'category'
    ));

    $builder->add('other_category', 'text', array(
        'label' => 'category',
        'required' => false,
        'invalid_message' => 'Please enter a valid category',
        'mapped' => false,
    ));
用户还可以向表中添加新类别。从下拉列表中选择“其他”时,将显示“其他类别”输入字段,否则将隐藏该字段。 “Other”是在该代码的帮助下添加到下拉列表中的

public function finishView(FormView $view, FormInterface $form, array $options)
{
    $new_choice = new ChoiceView(array(), 'other', 'Other');
    $view->children['category']->vars['choices'][] = $new_choice;
}
如果从下拉列表中选择了一个选项,则表单工作正常。数据存储时没有任何错误。但是,如果用户选择“其他”并输入一个新类别,页面将在类别选项下重新加载“此值无效”,并且用户输入的“其他类别”没有表单验证


是否有人可以帮助我进行表单验证以及输入新类别,或者建议更好的方法来实现上述功能。

发生验证错误的原因是表单字段类型为Entity,但没有标识值为“other”的“MyBundle:category”实体

您尚未在实体表单类型中指定“choice\u label”属性,因此我将假定您的“MyBundle:category”实体具有一个\u toString()函数。这意味着没有任何“MyBundle:category”实体在其_toString()函数中返回“other”

我现在可以想出两种解决方法:


1) 添加一个值为“其他”的“MyBundle:category”实体。这是最简单的方法,但我们假定您不希望数据库中存在这样的类别

2) 提前从控制器加载“MyBundle:category”实体列表,将它们构建到关联数组中,将“other”选项附加到数组中,然后将该数组传递给表单。您需要将实体表单类型交换为类型,并使用categories数组作为选项

如果表单是FormType类,则需要将数组与类构造函数一起传入


如果你不介意在你的分类表中有一个带有“other”值的新分类,只需添加它即可。否则,选择选项2,这对您在收到提交的表单后的操作没有太大影响,因为此表单字段无论如何都没有映射到实体属性