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

标签 php symfony symfony-forms

我正在尝试构建一个表单并将默认的“必需”状态设置为 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/

相关文章:

javascript - 使用 Angular 和 Symfony 进行路由

php - 同花顺 Doctrine 上的值设置为空

Symfony2 + swift mailer + 命令 : email body displayed into the console

symfony1 - 如何单独显示 sfWidgetFormChoice 的单选按钮?

symfony - 自适应 Symfony2 表单选择

php - MySQL连接服务器-客户端

php - 使用 API 将图像上传到 facebook 粉丝页面

php - 网络响应不适用于缩放

php - PHP 7 升级后 OwnCloud 电子邮件通知发送错误

php - 交响乐 2 : Save referer for form and redirect to it referer on submit