一个属性的多个字段

时间:2012-09-03 15:27:53

标签: php forms symfony

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

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

2 个答案:

答案 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日期选择器的文本字段!