Symfony 5 Dynami c Форма условной логики по умолчанию - PullRequest
1 голос
/ 19 февраля 2020

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

Позвольте мне попытаться объяснить, что такое мой сценарий использования и моя проблема с простой формой. Например, у меня есть форма Product с двумя полями:

  1. Part (choiceType => left, right)
  2. Length (numberType)

On изменить все поля (: input) отправляются через запрос Ajax. У меня есть два метода контроллера: один для посещения страницы (формируется форма), другой вызывается для визуализации формы с помощью запроса ajax (обработать условную логику c).

Для условная логика c часть следующее должно быть выполнено

  • Когда деталь оставлена, длина по умолчанию должна быть 50
  • Когда деталь правильна, длина по умолчанию должна быть 100
  • пользователь может изменить данные по умолчанию

Установка данных по умолчанию для длины по левому или правому краю не является проблемой. При выборе left длина по умолчанию становится 50. При изменении значения на 55 (форма отправляется через каждое изменение), оно снова становится 50. Это поведение logi c, но как можно перезаписать данные по умолчанию?

Вышеприведенная ситуация также может быть описана как предоставление пользователю данных по умолчанию с возможностью изменить их

тип формы

<?php
// ... namespace, use statments

class ProductType extends AbstractType
{
    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add('part', ChoiceType::class, array(
            'choices' => array(
                'Left' => 'left',
                'Right' => 'right',
            )
        ));

        $builder->add('length', NumberType::class);

        $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event) use ($options)
        {
            $form = $event->getForm();
            if(null === $product = $event->getData()) {
                return;
            }

            switch($product->getPart()) {
                case 'left': $defaultLength = 50; break;
                case 'right': $defaultLength = 100; break;
                default: $defaultLength = 0;
            }

            $form->get('length')->setData($defaultLength);
        });
    }

    /**
     * {@inheritDoc}
     */
    public function getName(): string
    {
        return 'product';
    }

    /**
     * {@inheritDoc}
     */
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults(array(
            'data_class' => Product::class,
            'translation_domain' => 'forms',
        ));
    }
}

контроллер

// src/Controller/ProductController.php

// ... namespace, use statments
namespace App\Controller;

class ProductController extends AbstractController
{
    public function productAction(Request $request): Response
    {
        $product = new Product();

        $form = $this->createForm(ProductType::class, $product);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $product = $form->getData();

            dd($product);
        }

        return $this->render('product_view.html.twig', array(
            'form' => $form->createView()
        ));
    }

    public function productConfigureAjaxAction(Request $request): Response
    {
        $product = new Product();
        $part = $request->request->get('product')['part'] ?? null;

        $product->setPart($part);

        $form = $this->createForm(ProductType::class, $product);
        $form->handleRequest($request);

        // product_form.html.twig is an separated file and included in product_view.html.twig
        // by making the form separated is could been used for an ajax response
        return $this->render('product_form.html.twig', array(
            'form' => $form->createView()
        ));
    }
}
...