Запрашиваемая согласие пользователя в Symfony Форма не отправляется - PullRequest
0 голосов
/ 22 января 2020

это мой первый пост на stackoverflow!

У меня есть эта проблема в моем методе контроллера. Я хотел бы спросить пользователя, хочет ли он добавить что-то, что он искал и не существует в базе данных. Но когда я спрашиваю его согласия, форма, которую я сделал, не отправляется. Я не уверен, ясно я или нет, но вот мои 2 формы и функция контроллера.

Первая форма, которую я использую:

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MachineOSType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name',TextType::class, [
                'label' => 'Nom de l\'OS'
            ])
            ->add('version',TextType::class, [
                'label' => 'Version de l\'OS',
                'required' => false
            ])
            ->add('Valider',SubmitType::class, [
                'attr' => ['class' => 'btn btn-block form-rounded btn-success']
            ])
    ;
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => null
    ]);
}
}

Вторая форма, запрашивающая согласие, просто да / нет (да / нет)

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ValidationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('reponse',ChoiceType::class,[
                    'label' => ' Choix ',
                    'choices'=> [
                        'Oui' => 1,
                        'Non' => 0,
                    ],
                    'expanded' => true,
                    'multiple' => false,
                    'label_attr' => ['class' => 'radio-inline text-center '],
                    'attr' => ['class' => 'text-center']
                ])
            ->add('Valider',SubmitType::class, [
                'attr' => ['class' => 'btn btn-block btn-success form-rounded']
            ])
    ;
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => null
    ]);
}
}

Контролер:

/**
 * @Route("/{id}/OS/add", name="os_machine_add_form", methods={"GET","POST"})
 */
public function os_machine_add_form(Machine $machine, Request $request, Request $request2, OperatingSystemRepository $osr)
{
    $em = $this->getDoctrine()->getManager();
    $form = $this->createForm(MachineOSType::class);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $nomOS = $form["name"]->getData();
        $verOS = $form["version"]->getData();
        $fullOS = [
            'nomOS' => $nomOS,
            'verOS' => $verOS
        ];
        if ($verOS != null) {
            $OS = $osr->findBy([
                'name' => $nomOS,
                'version' => $verOS,
            ]);
            $size = count($OS);
            if ($size == 0) {
                $form2 = $this->createForm(ValidationType::class);
                $form2->handleRequest($request2);
                if ($form2->isSubmitted() && $form2->isValid()) {
                    if ($form2["reponse"]->getData() == 1) {
                        $newOS = new OperatingSystem();
                        $newOS->setName($nomOS);
                        $newOS->setVersion($verOS);
                        $em->persist($newOS);
                        $em->flush();
                    } 
                }
                return $this->render('machine/os_add.html.twig', [
                    'fullos' => $fullOS,
                    'os' => $OS,
                    'machine' => $machine,
                    'form' => $form->createView(),
                    'form2' => $form2->createView(),
                ]);
            }
        }
    }
    return $this->render('machine/os_add.html.twig', [
        'machine' => $machine,
        'form' => $form->createView(),
    ]);
}

Вот что я получаю, когда отправляю что-то, чего нет в базе данных: Вывод изображения , но когда я нажимаю «Valider», он не создает нового объект.

Если у вас есть какие-либо предложения или какой-либо другой способ сделать это, я беру его, я вроде как новичок в Symfony так:)

Спасибо, что прочитали .

РЕДАКТИРОВАТЬ:

Я отбросил идею использования формы проверки. Я создал другую функцию, которую я вызывал в теге

Функция:

 /**
 * @Route("/{id}/user/validate/OS/{nomOS}/{verOS}", name="user_validate")
 */

 public function userValidate(Machine $machine,$nomOS, $verOS) {

    $em = $this->getDoctrine()->getManager();
    $newOS = new OperatingSystem;
    $newOS->setName($nomOS);
    $newOS->setVersion($verOS);
    $em->persist($newOS);
    $em->flush();

    return $this->redirectToRoute('machine_show', ['id' => $machine->getId()]);

}

И в ветке:

 <div class="col-md-6">
   <a href="{{path('user_validate'{id:machine.id,nomOS:fullos.nomOS,verOS:fullos.verOS})}}" class="btn btn-success btn-block"> Oui </a>
 </div>

Я не совсем уверен, если он чистый или безопасный, но пока подойдет.

1 Ответ

0 голосов
/ 22 января 2020

Две формы в одном действии. Это не лучшая практика, здесь у вас есть $ request и $ request2, вы передаете один и тот же аргумент в свое действие и пытаетесь обработать запрос вашей формы, чтобы ваша форма1 получила все данные формы двух форм поэтому он не будет действительным, если вы не разрешите дополнительные данные

...