Symfony 4 - Добавить поле, когда пользователь выбирает опцию (с FormEvent) - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть проблема, которую я не могу решить.Прежде всего, извините, если английский плохой, я француз, и я использую переводчик.

У меня есть страница, на которой я хотел бы отобразить раскрывающийся список только по умолчанию.И я хочу, чтобы, когда пользователь выбирает значение в списке, в зависимости от значения, он добавляет либо поле типа NumberType , либо поле типа TimeType .

Я видел в документе, что для этого есть FormEvents .И в моем случае это будет POST_SET_DATA .

Итак, я сделал эту форму :

<?php

namespace App\Form;

use App\Entity\RHCredit;
use App\Entity\TypeConge;
use Symfony\Component\Form\FormEvents;
use App\Repository\TypeCongeRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TimeType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormEvent;

class RHCreditType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('typeConge', EntityType::class, [
                'class' => TypeConge::class,
                'label' => false,
                'placeholder' => "Type d'absence",
                'choice_label' => 'nom',
                'choice_value' => 'nom',
                'query_builder' => function (TypeCongeRepository $repoTypes) {
                    return $repoTypes->getTypesSaufMaladie();
                }
            ])
            ->add('soldeFloat', NumberType::class);

        $builder->addEventListener(
            FormEvents::POST_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();

                $data = $event->getData();
                $typeConge = $data->getTypeConge();

                if ($typeConge) {
                    if ($typeConge->getNom() == "Heures supp") {
                        $form->add('soldeTime', TimeType::class);
                    } else {
                        $form->add('soldeFloat', NumberType::class);
                    }
                }
            }
        );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => RHCredit::class,
        ]);
    }
}

Я не знаю, нормально ли это,Но в любом случае в документации говорят, что вы должны javascript в файле Twig .

Итак, я запустил код:

{% block javascripts %}

    <script>

        var $typeConge = $("#rh_credit_typeConge");

        $typeConge.change(function () {
            var $form = $(this).closest('form');

            var data = {};
            data[$typeConge.attr('nom')] = $typeConge.val();

            console.log(data[$typeConge.attr('nom')]);

            $.post($form.attr('action'), data).then(function (data) {
                //And now ?
            })

        })
    </script>

{% endblock %}

Но я не знаю, как сделать мои поля " soldeFloat " моими " soldeTime " добавлены на основевыбор пользователя в списке.

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