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