Symfony - две формы активируются отдельно - PullRequest
0 голосов
/ 15 января 2019

Я написал функцию, которая имеет две формы, которые активируются отдельно, сохраняя одну и ту же сущность. Первый активируется для поля ввода, а второй - для случайно сгенерированного поля.

Но когда я нажимаю "Отправить", он активирует обе формы одну за другой. Если использовать условия, чтобы предотвратить это, но мне кажется, что это не работает.

Мой код:

     $id = $request->get('id');

    $user = $this->container->get('account')->getUserRepository()->find($id);

    $form1 = $this->createFormBuilder()
    ->add('password', PasswordType::class, array(
        'label' => 'Enter New Password',
        'attr' => ['class'=>'form-control']))
    ->add('save', SubmitType::class, array(
        'label' => 'Send', 'attr' => ['class' => 'btn btn-primary action-save']
    ))
    ->getForm();

    $form2 = $this->createFormBuilder()
    ->add('password', PasswordType::class, array(
        'label' => 'Generate New Password',
        'disabled'=> true,
        'attr' => ['class'=>'form-control']))
    ->add('save', SubmitType::class, array(
        'label' => 'Send',
        'attr' => ['class' => 'btn btn-primary action-save']
    ))
    ->getForm();

    $form1->handleRequest($request);
    if($form1->isSubmitted() && $form1->isValid()) {

        $this->addFlash(
            'notice',
            'You successfully changed the password!'
        );

        $data = $form1->getData();

        $new_password = $data['password'];

        $encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
        $new_pwd_encoded = $encoder->encodePassword($new_password);

        $oneTimePsw = '';
        $user->setPassword($new_pwd_encoded);
        $manager = $this->getDoctrine()->getManager();

        $manager->flush();
    }

    $form2->handleRequest($request);
    if($form2->isSubmitted() && $form2->isValid()) {

        $this->addFlash(
            'notice',
            'Password is successfully generated!'
        );

        $data = $form2->getData();

        $new_password = $data['password'];);

        $new = $this->get('member.account')->generateRandomPassword();

        $oneTimePsw = '';
        $user->setPassword($new);
        $manager = $this->getDoctrine()->getManager();

        $manager->flush();
    }
return $this->render('@AdminTemplates/admin/reset_password.html.twig', array(
        'form1' => $form1->createView(),
        'form2' => $form2->createView()
    ));

My twig

    <div id="setPassword" style="display:none;">
    {{ form_start(form1) }}

    {{ form_end(form1) }}
</div>

<div id="generatePassword" style="display:none;">
    {{ form_start(form2) }}

    {{ form_end(form2) }}
</div>

1 Ответ

0 голосов
/ 15 января 2019

Я думаю, что ваша проблема проста, если еще проблема анидирования, когда у меня была такая же проблема, вот что я сделал:

$id = $request->get('id');

$user = $this->container->get('account')->getUserRepository()->find($id);

$form1 = $this->createFormBuilder()
->add('password', PasswordType::class, array(
    'label' => 'Enter New Password',
    'attr' => ['class'=>'form-control']))
->add('save', SubmitType::class, array(
    'label' => 'Send', 'attr' => ['class' => 'btn btn-primary action-save']
))
->getForm();

$form2 = $this->createFormBuilder()
->add('password', PasswordType::class, array(
    'label' => 'Generate New Password',
    'disabled'=> true,
    'attr' => ['class'=>'form-control']))
->add('save', SubmitType::class, array(
    'label' => 'Send',
    'attr' => ['class' => 'btn btn-primary action-save']
))
->getForm();
$form1->handleRequest($request);
$form2->handleRequest($request);
if($form1->isSubmitted() && $form1->isValid()) {

    $this->addFlash(
        'notice',
        'You successfully changed the password!'
    );

    $data = $form1->getData();

    $new_password = $data['password'];

    $encoder = $this->container->get('security.encoder_factory')->getEncoder($user);
    $new_pwd_encoded = $encoder->encodePassword($new_password);

    $oneTimePsw = '';
    $user->setPassword($new_pwd_encoded);
    $manager = $this->getDoctrine()->getManager();

    $manager->flush();
}else

    if($form2->isSubmitted() && $form2->isValid()) {

    $this->addFlash(
        'notice',
        'Password is successfully generated!'
    );

    $data = $form2->getData();

    $new_password = $data['password'];);

    $new = $this->get('member.account')->generateRandomPassword();

    $oneTimePsw = '';
    $user->setPassword($new);
    $manager = $this->getDoctrine()->getManager();

    $manager->flush();
}
return $this->render('@AdminTemplates/admin/reset_password.html.twig', array(
    'form1' => $form1->createView(),
    'form2' => $form2->createView()
));

Это должно работать, потому что пользователь не может отправить 2 формы одновременно. У меня также была проблема с методом isValid (), поэтому попробуйте также протестировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...