【问题标题】:Symfony - two forms activate separatelySymfony - 两种形式分别激活
【发布时间】:2026-02-15 18:50:01
【问题描述】:

我写了一个函数,它有两种形式,分别激活,保持相同的实体。第一个为输入字段激活,第二个为随机生成的字段激活。

但是当我点击提交时,它会一个接一个地激活两个表单。如果使用条件来防止这种情况,但我似乎它不起作用。

我的代码:

     $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>

【问题讨论】:

  • 请发布您的reset_password.html.twig 文件。您可能已经将两个表单相互嵌套,这样在提交一个表单时,另一个表单也会被触发。
  • 已更新。我认为模板还可以。 @MaximilianKaske
  • 好的,如果两个表单名称不同,请查看您的网络检查器。在我看来,这两种形式都有相同的形式名称。如果是这样,提交一个将自动提交另一个。
  • @MaximilianKaske 我认为这是表单的 id 而不是名称。

标签: forms symfony twig


【解决方案1】:

我认为你的问题是一个简单的 if else anidation 问题,当我遇到同样的问题时,这就是我所做的:

$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() 方法的问题,所以也尝试测试将其删除。

【讨论】: