【问题标题】:Symfony 2 - updating a user passwordSymfony 2 - 更新用户密码
【发布时间】:2015-02-21 13:33:06
【问题描述】:

我已经从我的用户实体表单类型构建了一个添加用户表单。

此表单的验证在validation.yml 中指定,并且很有效。

但是,我知道希望实现编辑用户的功能。

我遇到的问题是更新用户密码字段,因为它们是字段的验证约束,不能留空。

我想重写此验证,以某种方式编辑用户或我可以实现此逻辑的某些方法(下面的伪代码示例):

If password is blank
    do not update the password field
else if password is populated
    trigger existing validation constraints as set in validation.yml
endif

我在网络上到处搜索,似乎找不到针对非常普遍的做法的体面解决方案。

控制器方法:

public function editAction(Request $request, $id){
    $title = "Edit Player";
    $user = $this->getUser();

    //find the user objet by id
    $fetchedUser = $this->getDoctrine()
        ->getRepository('BrsUserBundle:User')
        ->findOneById($id);

    //create form from the found user object
    $form = $this->createForm(new UserType(true), $fetchedUser);

    //set the data from the join on the form select
    $form->get('roles')->setData($fetchedUser->getRole()->current());

    $currentPassword = $fetchedUser->getPassword();

    $form->handleRequest($request);

    // if($first = $request->get('user')['password']['first'] === "" && $second = $request->get('user')['password']['second'] === ""){
    //     $request->request->set('password',$currentPassword);
    // }


    // $form->getData()->setPassword('fdsfdsfdsffdsdfsfdsfdsfdsf');

    // print_r($form->getData()->getPassword());
    // var_dump($form->isEmpty());

    return $this->render('BrsUserBundle:Crud:edit.html.twig', array(
            'user'=>$user,
            'title'=>$title,
            'form'=>$form->createView()
        ));
}

用户表单类型:(正在进行中,所以尝试不同的东西)

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


            $builder
                ->add('username')
                ->add('roles','entity',array(
                    'class' => 'BrsUserBundle:Role',
                    'property' => 'role',
                ))
                ->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event){
                    $user = $event->getData();
                    $form = $event->getForm();
                    //var_dump($user['password']['first'] === '');
                    // $user['password']['second'] = "adssadasdsadsadsa";
                    // if($form->getData()->getPassword() && ($user['password']['first'] === '' && $user['password']['second'] === '')){
                    //     unset($user['password']);
                    // }

                    //print_r($user);
                    //$event->setData($user);
                    $form->setData($user);
                    // print_r($form->getData());
                    var_dump($form->isValid());
                })
                ->add('fname')
                ->add('lname')
                ->add('email')
                ->add('mobile')
                ->add('active')
                ->add('mentor')
                ->add('initialized');
 //$builder->add( 'first_name', 'text', [ 'constraints' => new NotBlank( ['message'=>'Please provide your First Name.'] ), 'label' => 'First Name' ] )
                $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
                    $user = $event->getData();
                    $form = $event->getForm();
                    print_r($form->getData()->getPassword());
                    $builder->add('password','repeated',array(
                        'type' => 'password',
                        'invalid_message' => 'The password fields must match.',
                        'options' => array('attr' => array('class' => 'password-field')),
                        'first_options'  => array('label' => 'Password'),
                        'second_options' => array('label' => 'Repeat Password'),
                        'required'=>false,
                    ));
                });

                $builder->add('save','submit');
    }

validation.yml

Brs\UserBundle\Entity\User:
properties:
    username:
        - NotBlank: ~
        - Length:
            min: 5
    fname:
        - NotBlank: ~
        - Length:
            min: 3
    lname:
        - NotBlank: ~
        - Length:
            min: 3
    email:
        - Email:
            message: The email "{{ value }}" is not a valid email address.
            checkMX: true
        - NotBlank: ~
        - Length:
            min: 5
    mobile:
        - NotBlank: ~
    active:
    mentor:
    initialized:
        - Type: \DateTime
    password:
        - NotBlank: ~
        - Length:
            min: 8

任何帮助将不胜感激。

亚当

【问题讨论】:

  • 你想多了。让自己成为一个专用的 ChangePasswordFormType 和控制器。要求输入新密码并进行更新。
  • 我是这么认为的,你能详细说明一下你会怎么做吗?
  • 您可以在表单构建器中设置一个“tempPassword”(非映射),并在其上进行逻辑,如果 tempPassword 有效,则由 usermanager 设置 plainPassword...
  • @Yenne Info,您能否详细说明如何操作?

标签: php forms validation symfony


【解决方案1】:

在表单类型中:

(remove password field before)
$builder->add('temppassword','repeated',[
                        'type' => 'password',
                        'mapped'=>false,
                        'required'=>false
                    ]);

在控制器中:

$tempPassword = $form->get('temppassword')->getData();
/*make your logiq*/
if (yourlogic is good)
{
     $user->setPlainpassword( $tempsPassword );
}

【讨论】:

  • 我无法从表单类型中删除密码,因为表单类型用于添加用户操作。
  • 您可以将变量传递给添加/不添加密码字段的 formType 构造函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多