我的项目是使用Silex和Symfony Components(即表单组件)编写的。
我尝试创建一组由班级构建的单选按钮,我想预先选择其中一个收音机。
我创建了这样的形式:
$form = $app['form.factory']->createBuilder(new QueryFormType(), $query)
其中QueryFormType
是我的自定义类型(它扩展AbstractType),我在其中定义表单字段,$query
是一个具有表单默认值的实体。
QueryFormType
中的表单字段看起来像那样(为了清楚起见,我省略了构建器和其他字段):
->add('contractPeriod', 'filter', array(
'label' => 'Contract Period:',
'choices' => array(
'-1' => 'No period',
'1' => '1 month',
'2' => '2 months',
'3' => '3 months',
'6' => '6 months',
'12' => '12 months',
'18' => '18 months'
),
'expanded' => TRUE,
'multiple' => FALSE
))
$query
是应该预选单选按钮的类的实例。在它的构造函数中,您将找到:
$this->contractPeriod = '3';
它也具有此属性的正确getter和setter。
现在。表单和单选按钮正确呈现。单选按钮已预先选择为'3' => '3 months'
。当我在定义列表中检查更高的无线电(因此2,1或-1)时,将其接受为值。但是当我在定义的列表(6,12或18)中检查值较低时,它使用$query
中设置的默认值。到底是什么?
我的问题是如何正确设置默认值,以便在表单呈现后我可以选择其他任何值?
我已经尝试过使用'数据'表单字段定义中的属性,它是相同的故事。我只能选择较低的值但不能更高。我厌倦了使用" preferred_choices'但它没有按照我预期的方式工作(弄乱了输入的ID)。
求求你帮忙。
修改
这是我提交表单的方式:
$form->submit($request->query->get($form->getName()), FALSE);
我发现如果我将clearMissing设置为TRUE(第二个参数)它运行良好,但我不能进行部分预填充(或修补表单)。似乎是一个错误。
修改
它与symfony组件的Form类中的那些行有关:
if ($isSubmitted || $clearMissing) {
$child->submit($isSubmitted ? $submittedData[$name] : null, $clearMissing);
unset($submittedData[$name]);
if (null !== $this->clickedButton) {
continue;
}
if ($child instanceof ClickableInterface && $child->isClicked()) {
$this->clickedButton = $child;
continue;
}
if (method_exists($child, 'getClickedButton') && null !== $child->getClickedButton()) {
$this->clickedButton = $child->getClickedButton();
}
}
$ child->只有在表格中设置的默认值低于/等于它的父级(在本例中为Form)时,才将提交更新viewData的数据提交给提交值。为什么呢?
修改
我认为Form组件在默认值之后不会提交子节点,在那种情况下是Submited == false和clearMissing == false。这使得只有值可达到默认值。但我不知道。