2012-08-08 82 views
0

給定一個典型的用於管理用戶帳戶的Doctrine實體,假設我想爲註冊用戶提供一個僅由用於修改其職業生物的字段組成的表單。這意味着僅描述將被傳遞迴update行動:Symfony表格 - 部分對象更新

public function updateAction(Project $project, Request $request) 
{ 
    $user = SOME_RETRIEVED_USER_OBJECT; 
    $form = $this->createForm(new UserForm(), $user); 
    $form->bindRequest($request); 
    ... 
} 

但是,在執行bindRequest後,所有的$user屬性值除了的生物都是空的。當然,有一些方法可以在Symfony中執行部分對象更新?

回答

3

表單中的字段定義將更新哪些實體屬性。最簡單的方法是創建一個需要被更新,並使用

$form = $this->createForm(new UserFormOneField(), $user); 

而且你需要確保你選擇正確的驗證組,針對這種情況一個領域一個單獨的表單類型。

-1

您可以將表單與收到的POST值進行比較,並刪除不存在的值。可以將此功能添加到您的控制器:

private function updateFormAccordingToRequest($form){ 
    $form_fields = array(); 
    foreach($form->getChildren() as $c) $form_fields[] = $c->getName(); 
    $post_fields = array_keys($this->getRequest()->request->get($form->getName())); 
    $fields_to_remove = array_diff($form_fields, $post_fields); 
    foreach($fields_to_remove as $f) $form->remove($f); 
    return $form; 
} 

..然後更新您的形式,只要你想做的部分更新:

$form = $this->createForm(new UserForm(), $user); 
$form = $this->updateFormAccordingToRequest($form); 
$form->bindRequest($request);