Использование Javascript внутри Type Class Symfony - PullRequest
0 голосов
/ 10 мая 2019

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

Проблема в том, что я не знаю, как это сделать с Symfony 4. Я генерирую свои формы с помощью команды make:form.

Вот мой текущий контроллер (код для создания конструктора еще не здесь)

CatalogueController


class CatalogueController extends AbstractController
{
    /**
     * @Route("/admin/catalogues/create", name="admin.catalogues.new")
     * @param Request $request
     * @return RedirectResponse | Response
     */
    public function new(Request $request)
    {
        $catalogue = new Catalogue();
        $form = $this->createForm(CatalogueType::class, $catalogue);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()){
            $this->em->persist($catalogue);
            $this->em->flush();
            $this ->addFlash('success', 'Catalogue crée avec succès');
            return $this->redirectToRoute('admin.catalogues.index');
        }
        return $this->render('/admin/catalogues/create.html.twig', [
            'catalogue' => $catalogue,
            'form' => $form->createView()
        ]);
    }
//some codes
}

Вот мой CatalogueType (вы можете увидеть constructeur_id

CatalogueType


class CatalogueType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('catalogue_date_debut', DateType::class, [
                'widget' => 'single_text',
                'html5' => false,
                'attr' => ['class' => 'datepicker'],
            ])
            ->add('catalogue_date_fin', DateType::class, [
                'placeholder' => 'Sélectionner un date de début',
                'widget' => 'single_text',
                'html5' => false,
                'attr' => ['class' => 'datepicker'],
            ])
            ->add('is_active', CheckboxType::class, [
                'label'    => 'Le catalogue est-il actif ?',
                'value' => 0,
                'required' => false,
            ])
            ->add('entreprise_id')
            ->add('contructeur_id')
        ;
    }

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

А вот мой взгляд и как я реализую свою форму

create.html.twig

{% extends 'admin/baseadmin_html.twig' %}

{% block title %}Créer un Catalogue{% endblock %}


{% block body %}
    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card white">
                <div class="card-content black-text">
                    <span class="card-title">Créer un Catalogue</span>
                </div>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col s12 m12 l12">
            <div class="card-panel ">
                <div class="row">

                    {{ form_start(form) }}
                    {{ form_widget(form) }}


                    <button class="btn s12 m6 l3">{{ button|default('Enregister') }}</button>
                    {{ form_end(form) }}
                </div>
            </div>
        </div>
    </div>
{% endblock %}

Итак, вот мой вопрос. Как я могу разрешить моему пользователю, когда он установит флажок, чтобы Скрыть выбор на моем constructeur_id и показать новый ввод, где пользователь собирается написать имя constructeur (я знаю, как это сделать позже с контроллером, но как я могу иметь дело с видом.)

1 Ответ

0 голосов
/ 10 мая 2019

Вы можете встроить форму в другую в Symfony: https://symfony.com/doc/current/form/embedded.html

Таким образом, по умолчанию выбранная И внедренная форма будет добавлена ​​в вашу форму в представлении.

Тогда вы простонужно немного JS, чтобы замаскировать встроенную форму, скрытую по умолчанию, и переключать два элемента по мере необходимости, в зависимости от того, установлен флажок или нет, и вуаля!

btw, если Contructeur и Enterprise являются сущностями, вы можете использоватьEntityType для отображения выбора (Doctrine будет обрабатывать ассоциацию при сохранении).

...