如果空白(symfony2形式)如何使表单忽略密码字段

Mat*_*der 18 php forms symfony

我的后端有一个简单的用户管理器,我希望能够在不设置新密码/每次重复旧密码的情况下编辑用户.

现在,如果我在编辑用户时将密码字段留空,symfony2会抱怨必须输入密码,当然我在注册新用户时需要此功能,但是当我编辑它们时,我希望表单能够如果没有填写密码框,请忽略它们.

这是如何完成的?

Mat*_*der 26

对于其他人的参考,我以这种方式工作.

我的formType:

public function buildForm(FormBuilder $builder, array $options)
{   

    $builder
        ->add('username', 'text', array('label' => 'Servernamn '))            
        ->add('plainPassword', 'repeated', array('type' => 'password', 'first_name' => 'Lösenord för server ', 'second_name' => 'Upprepa lösenord för server',));

    $builder-> addValidator(new CallbackValidator(function(FormInterface $form){
      $username = $form->get('username')->getData();
        if (empty($username)) {
          $form['username']->addError(new FormError("Du måste ange ett namn för servern"));
        }
    }));

}
Run Code Online (Sandbox Code Playgroud)

我的updateAction:

public function updateServerAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $entity = $em->getRepository('BizTVUserBundle:User')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Container entity.');
    }

    $originalPassword = $entity->getPassword(); 

    $editForm   = $this->createForm(new editServerType(), $entity);

    $request = $this->getRequest();

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {

        $plainPassword = $editForm->get('plainPassword')->getData();
        if (!empty($plainPassword))  {  
            //encode the password   
            $encoder = $this->container->get('security.encoder_factory')->getEncoder($entity); //get encoder for hashing pwd later
            $tempPassword = $encoder->encodePassword($entity->getPassword(), $entity->getSalt()); 
            $entity->setPassword($tempPassword);                
        }
        else {
            $entity->setPassword($originalPassword);
        }

        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('Server'));
    }
Run Code Online (Sandbox Code Playgroud)

因此,应该设置更新我的用户密码,否则保留原始密码.


Die*_*tro 14

在您的密码属性的实体设置器上,使它像这样:

/**
 * Set password
 *
 * @param string $password
 * @return User
 */
public function setPassword($password)
{
    if (!is_null($password)) {
        $this->password = $password;
    }

    return $this;
}
Run Code Online (Sandbox Code Playgroud)

诀窍是检查传递的参数是否为空,只检查是否为空.

  • 但是如果用户输入空密码怎么样? (3认同)