我是symfony的新手。我在表单中有一个下拉列表,其中包含从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_category'输入字段显示,否则隐藏。 '其他'在此代码的帮助下添加了下拉列表。
public function finishView(FormView $view, FormInterface $form, array $options)
{
$new_choice = new ChoiceView(array(), 'other', 'Other');
$view->children['category']->vars['choices'][] = $new_choice;
}
如果从下拉列表中选择了一个选项,表单可以正常工作。数据存储没有任何错误。但是,如果用户选择其他'并输入一个新的类别页面重新加载'此值无效'在类别选项下,' other_category'没有表格验证。由用户输入。
有人可以帮助我进行表单验证,也可以输入新类别或建议更好的方法来实现上述功能。
答案 0 :(得分:0)
验证错误正在发生,因为表单字段类型是实体,但没有" MyBundle:category"具有识别价值的实体"其他"。
您尚未指定" choice_label"您的实体表单类型中的属性,因此我将假设您的" MyBundle:category" entity有一个__toString()函数。这意味着没有任何" MyBundle:类别"实体返回"其他"在他们的__toString()函数中。
我现在可以考虑两种方法来解决这个问题:
1)添加" MyBundle:类别"有价值的实体"其他"。这是最简单的方法,但它相当假设您不希望数据库中存在这样的类别。
2)加载" MyBundle:类别"来自你的控制器的实体,将它们构建成一个关联数组,附加你的"其他"数组的选项,然后将该数组传递给表单。您需要将实体表单类型换成Choice type,并使用categories数组作为选项。
如果您的表单是FormType类,则需要使用类构造函数传递数组。
如果您不介意使用"其他"您的类别表中的值,只需添加它。否则,请转到选项2,因为此表单字段未映射到实体属性,因此不会对收到提交的表单后的操作产生太大影响。