1

假设我有三个字段供用户输入日期:日、月和年。(可能不是最好的方法,但我在这个例子中使用它)。如果我尝试$form->bind()用户的请求,Symfony 将尝试在我的模型上寻找一个->setMonth()不存在的方法。

我如何告诉 Symfony 我想通过strtotime()(或任何其他任何其他任意代码或方法)运行输入,然后将新输出映射到setDate()

4

2 回答 2

4

首先,你需要告诉 symfony 这些字段没有对应的 Entity 属性。这是通过 'property_path' 选项来完成的

$builder->add("field1", "text", array(
    "property_path" => false
));

在您的控制器中,一旦您检查了表单是否有效并且在持久化实体之前,您可以使用以下内容获取这些字段的值:

$field1 = $form->get('field1')->getData();

然后根据需要使用这些值来构造实体属性,例如:

$entity->setWhatever($field1.$field2.$field3);

如果您需要对这些字段进行某种验证,最好的选择是编写回调验证器。

于 2012-09-03T18:05:09.563 回答
1

不要只为用户类的一个属性“日期”使用多个 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 !

于 2012-09-03T15:47:52.610 回答