2013-06-20 25 views
4

我想在兩個條件來更新數據:如何從表單中刪除了symfony表單處理空值字段

  1. 當用戶在表單中的所有字段(姓名,電子郵件,密碼)
  2. 當用戶沒有輸入密碼時(我只需更新名稱&電子郵件)。

我有以下formHandler方法。

public function process(UserInterface $user) 
{ 
    $this->form->setData($user); 

    if ('POST' === $this->request->getMethod()) {      

     $password = trim($this->request->get('fos_user_profile_form')['password']) ; 
     // Checked where password is empty 
        // But when I remove the password field, it doesn't update anything. 
     if(empty($password)) 
     { 
      $this->form->remove('password');    
     } 

     $this->form->bind($this->request); 

     if ($this->form->isValid()) { 
      $this->onSuccess($user); 

      return true; 
     } 

     // Reloads the user to reset its username. This is needed when the 
     // username or password have been changed to avoid issues with the 
     // security layer. 
     $this->userManager->reloadUser($user); 
    } 
+0

我認爲你可以使用Form事件來解決這個問題 –

+0

@Wo子宮如果他想改變形式(如標題所示),但如果是數據(正如身體所說)? – cheesemacfly

+0

我想改變窗體。如果密碼字段爲空,則要刪除密碼字段。然後提交剩餘的數據。 – user2506165

回答

5

一個簡單的解決問題的方法是禁用密碼字段的映射,並將其值手動複製到你的模型,除非它是空的。示例代碼:

$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormInterface $form) { 
    $form = $event->getForm(); 
    $user = $form->getData(); 

    if (null !== $form->get('password')->getData()) { 
     $user->setPassword($form->get('password')->getData()); 
    } 
}); 
1

更簡單的方法:

/my/Entity/User 

public function setPassword($password) 
{ 
    if ($password) { 
     $this->password = $password; 
    } 
} 

因此,任何形式的

$form = $this->createFormBuilder() 
    ->add('name', 'text') 
    ->add('email', 'repeated', array('type' => 'email')) 
    ->add('password', 'repeated', array('type' => 'password', 'mapped' => false)) 
    // ... 
    ->getForm(); 

// Symfony 2.3+ 
$form->handleRequest($request); 

// Symfony < 2.3 
if ('POST' === $request->getMethod()) { 
    $form->bind($request); 
} 

// all versions 
if ($form->isValid()) { 
    $user = $form->getData(); 

    if (null !== $form->get('password')->getData()) { 
     $user->setPassword($form->get('password')->getData()); 
    } 

    // persist $user 
} 

你也可以這樣的邏輯,如果你希望將自己的控制器清潔添加到您的表單類型使用用戶密碼將按預期行事:)