假设我有三个字段供用户输入日期:日,月和年。 (可能不是最好的方式,但我在这个例子中使用它)。如果我尝试$form->bind()
用户的请求,Symfony将尝试在我的模型上寻找->setMonth()
方法,该方法不存在。
如何告诉Symfony我之前要通过strtotime()
(或任何其他任意代码或方法)运行输入,然后将新输出映射到setDate()
?
答案 0 :(得分:4)
首先,您需要告诉symfony这些字段没有相应的Entity属性。这是通过'property_path'选项完成的,就像这样做
$builder->add("field1", "text", array(
"property_path" => false
));
在您的控制器中,一旦您检查了表单是否有效并且在保留实体之前,您可以使用以下内容获取这些字段的值:
$field1 = $form->get('field1')->getData();
然后根据需要使用这些值构建实体属性,例如:
$entity->setWhatever($field1.$field2.$field3);
如果您需要对这些字段进行某种验证,最好的选择是编写回调验证器。
答案 1 :(得分:1)
不要仅为用户类的一个属性“date”使用复数html字段。
参考文献:http://symfony.com/doc/current/reference/forms/types/date.html
由于选项“小部件”,可以根据需要呈现字段日期。
在您的情况下,您需要3个字段,您必须设置值“choice”(呈现三个选择输入。选择的顺序在模式选项中定义。)
这里是表单类中的代码:
$builder->add('date', 'date', array(
'widget' => 'choice',
));
您还希望在提交表单后获得时间戳(“strtotime”):
$builder->add('date', 'date', array(
'widget' => 'choice',
'input' => 'timestamp',
));
您可以使用其他选项,例如,只获取激活JS日期选择器的文本字段!