gpt4 book ai didi

php - 如何在 Symfony 3 中设置默认表单所需状态(并在构建器中覆盖)?

转载 作者:行者123 更新时间:2023-12-05 07:41:03 25 4
gpt4 key购买 nike

我正在尝试构建一个表单并将默认的“必需”状态设置为 false,然后让表单构建配置覆盖它,将一些设置为 true。

如果我不添加任何配置选项,这些字段默认为“必需”为真,我可以用特定配置覆盖它们。

但是,如果我添加:

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('required', false);
}

我无法在特定配置中覆盖它(这不会使 required 为真):

->add('name',TextType::class, array(
'required' => true,
'constraints' => array(new Length(array('min' => 3)))
))

有没有办法做到这一点,或者我必须始终不设置默认值并指定每个配置?

最佳答案

这可以通过 PRE_SET_DATA Symfony form event 实现.本质上,您需要做的是在该表单事件中重新添加所有表单字段。当您将它们添加到表单事件中时,它们将覆盖您现有的同名表单字段。您想要添加所有信息相同的字段,同时替换表单选项数组并手动将 required 选项设置为 false。看看:

class MyType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(/* ... */)
->add(/* ... */)
;

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

// loop through each form field
foreach ($form->all() as $field) {
$config = $field->getConfig();
$options = $config->getOptions();

// re-add the form field and overwrite the 'required' option
// this overwrites the existing field
$form->add(
$field->getName(),
get_class($config->getType()->getInnerType()),
array_replace($options, ['required' => false])
);
}
});
}
}

注意下面一行:

get_class($config->getType()->getInnerType()),

应该是

$config->getType()->getName()

如果您使用的是早于 Symfony 3 的 Symfony 版本。

作为一些背景,FormConfigInterface 接口(interface)的设计不允许在配置已经设置后进行修改。如果你看一眼里面,它只有 gethas 功能——所以什么都不能手动设置。添加表单/表单字段时必须这样做。

如果你想在你的项目中实现这个全局,你可以创建一个基本表单类型,在 buildForm() 事件中包含这个功能,然后你的所有子表单都可以在设置后调用父表单他们自己。您也可以对单个字段执行此操作 - 而不是循环

foreach ($form->all() as $field) {

你可以简单地改变一个特定的领域

$config = $form->get('field_name');
$options = $config->getOptions();

$form->add(
'field_name',
get_class($config->getType()->getInnerType()),
array_replace($options, ['required' => false])
);

关于php - 如何在 Symfony 3 中设置默认表单所需状态(并在构建器中覆盖)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com