2012-09-03 44 views
0

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

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

+0

你真的想输入日期还是仅仅是一个例子? –

+0

日期只是一个例子。我更想要一种在数据传递给setter之前拦截数据的方法。在我的具体情况下,有三个输入,它们被序列化在一起,然后存储为属性的值。 – Shane

回答

4

首先,您需要告诉symfony这些字段没有相应的Entity属性。这与“property_path”选项做这样的事情

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

在你的控制器,一旦你已经检查了形式是有效的,持续的,你可以得到使用类似这些字段的值的实体之前完成:

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

,然后使用这些值来构建你的实体属性,因为你需要,例如:

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

如果您需要做某种验证在这些领域,你最好的选择是编写一个回调验证器。

+0

使用:'mapped'=> false而不是“property_path”=> false。 – Daniel

1

不要在用户类的一个属性“date”中使用复数的html字段。

在参考:http://symfony.com/doc/current/reference/forms/types/date.html

,只要你想感谢选项“窗口小部件”字段日期可以呈现。在你的情况下,你需要3个字段,你必须设置值“choice”(呈现三个选择输入,选择的顺序是在pattern选项中定义的)。

在这里,在窗体类代码:

$builder->add('date', 'date', array(
    'widget' => 'choice', 
)); 

你也想获得一个时间戳(“的strtotime”)的形式提交后:

$builder->add('date', 'date', array(
    'widget' => 'choice', 
    'input' => 'timestamp', 
)); 

您可以用其他选项玩,例如,以获得只激活JS日期选择器的文本字段!

相关问题