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