2012-09-03 40 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日期選擇器的文本字段!

相關問題