20

バックエンドにシンプルなユーザー マネージャーがあり、新しいパスワードを設定したり、毎回古いパスワードを繰り返したりせずにユーザーを編集できるようにしたいと考えています。

現在、ユーザーを編集するときにパスワード フィールドを空白のままにしておくと、symfony2 はパスワードを入力する必要があると文句を言います。もちろん、新しいユーザーを登録するときにこの機能が必要ですが、それらを編集するときに、フォームを入力されていない場合は、パスワード ボックスを無視してください。

これはどのように達成されますか?

4

8 に答える 8

27

他の誰かの参考のために、私はこれをこのように解決しました。

私の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"));
        }
    }));

}

私の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'));
    }

したがって、ユーザーのパスワードを更新する必要があります。それ以外の場合は、元のパスワードを保持します。

于 2012-08-17T21:08:01.507 に答える
16

password プロパティのエンティティ セッターで、次のようにします。

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

    return $this;
}

トリックは、渡されるパラメーターが空であるかどうかを確認し、そうでない場合にのみ設定することです。

于 2014-08-29T14:59:36.950 に答える
4

必要なオプションを$options配列に追加する必要がある場合例:

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

    $builder
        ->add('username', 'text', array('label' => 'Servernamn '))            
        ->add('plainPassword', 'repeated', array(
                  'type' => 'password', 
                  'first_name' => 'password', 
                  'second_name' => 'repeat_password', 
                  'required' => false,
            ));
}
于 2012-12-20T14:45:04.880 に答える
2

私がしたことは、そのままにUserTypeして、コントローラーのパスワードフィールドのみを削除することでした:

/**
 * @Route("/users/edit/{username}", name="user_edit")
 */
public function editAction(Request $request, User $user)
{
    $form = $this->createForm(UserType::class, $user);

    // Remove the password field when editing the user
    // Otherwise it must be entered each time the user is edited
    // We can change the password via a special edit-user-password page
    $form->remove('password');

    $form->handleRequest($request);

    if ($form->isValid()) {
        // ...
    }
}

このようにして、editAction と newAction で再利用可能な単一の UserType を持つことができます。

$form->remove('password');の前に必ず行を追加してください$form->handleRequest($request);

于 2016-07-15T11:12:24.313 に答える
-1

検証には、2 つの異なる検証グループを使用し、呼び出し可能な関数によって正しいものを設定します。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add(
        'oldPassword',
        PasswordType::class,
        [
            'constraints' => new UserPassword([
                'groups' => 'profile_password',
            ]),
            'mapped' => false,
            'required' => false,
        ]
    );

    $builder->add(
        'plainPassword',
        PasswordType::class,
        [
            'constraints' => new NotBlank([
                'groups' => 'profile_password',
            ]),
            'mapped' => false,
            'required' => false,
        ]
    );
}

/**
 * {@inheritdoc}
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(
        [
            'validation_groups' => function (FormInterface $form) {
                $newPassword = $form->get('plainPassword')->getData();
                $oldPassword = $form->get('oldPassword')->getData();
                if ($oldPassword || $newPassword) {
                    return ['profile', 'profile_password'];
                } else {
                    return ['profile'];
                }
            },
        ]
    );
}
于 2016-09-05T09:23:27.717 に答える
-4

あなたは何かをすることができます

if (empty($password)) {
     //edit the password
}

それをフォームの PHP に修正してみてください。

于 2012-08-14T21:57:27.713 に答える