Forms Symfony 5动态形式条件默认逻辑

Forms Symfony 5动态形式条件默认逻辑,forms,symfony,symfony-forms,dynamic-forms,symfony5,Forms,Symfony,Symfony Forms,Dynamic Forms,Symfony5,我有一个用例,在symfony5中的动态表单构建中需要一些默认的条件逻辑 让我试着用一个简单的形式来解释我的用例是什么以及我的问题。 例如,我有一个带有两个字段的表单产品: 部分(choiceType=>左、右) 长度(数字类型) 更改时,通过Ajax请求提交所有字段(:input)。 我有两种控制器方法,一种用于访问页面(正在构建表单),另一种用于访问页面 正在调用,以便通过ajax请求(处理条件逻辑)呈现表单 对于条件逻辑部分,需要执行以下操作 保留零件时,默认长度需要为50 零件正确时,

我有一个用例,在symfony5中的动态表单构建中需要一些默认的条件逻辑

让我试着用一个简单的形式来解释我的用例是什么以及我的问题。 例如,我有一个带有两个字段的表单产品:

  • 部分(choiceType=>左、右)
  • 长度(数字类型)
  • 更改时,通过Ajax请求提交所有字段(:input)。 我有两种控制器方法,一种用于访问页面(正在构建表单),另一种用于访问页面 正在调用,以便通过ajax请求(处理条件逻辑)呈现表单

    对于条件逻辑部分,需要执行以下操作

    • 保留零件时,默认长度需要为50
    • 零件正确时,默认长度需要为100
    • 用户可以更改默认数据
    设置基于左或右的默认长度数据不是问题。 选择“左”时,默认长度为50。将值更改为55(每次更改都会提交表单)时,它再次变为50。 这种行为是合乎逻辑的,但如何覆盖默认数据

    上述情况也可以描述为给用户默认数据,并选择更改它

    表单类型

    <?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',
            ));
        }
    }
    

    是Symfony 2.x、3.x还是4.x?以上情况是基于Symfony 5构建的,只是没有设置数据,如果它存在于formI中,我认为这个表单应该用javascript填充。在symfony端,不设置默认数据。这对我来说更简单和实用。没有额外的认知负荷。此外,如果长度字段有固定值(50、20),则可以将其设置为POST表单后的模型。它是Symfony 2.x、3.x还是4.x?上述情况是基于Symfony 5构建的,如果表单中存在,则不设置数据。我认为此表单应该用javascript填充。在symfony端,不设置默认数据。这对我来说更简单和实用。没有额外的认知负荷。此外,若长度字段具有固定值(50,20),则可以将其设置为POST form后的model。
    // 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()
            ));
        }
    }