微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Symfony 表单不会通过使用 FormEvents::PRE_SUBMIT 更改值

如何解决Symfony 表单不会通过使用 FormEvents::PRE_SUBMIT 更改值

我遇到了以下问题:在 Symfony(4.4.22 版)中,我创建了一个带有日期字段和复选框的 FormType。如果选中该复选框,则该字段的值应为“31.12.9999”。

如果请求表单的字段 infiniteValidTo 的值为 1,则 validTo 的值应从空更改为“31.12.9999”。 (在我的情况下,提交表单时日期字段的值为“null”。)

因此,我使用 pre_submit 钩子向表单构建器添加一个 EventListener,它将在表单验证之前添加此信息。


  /**
   * {@inheritdoc}
   */
  public function buildForm(FormBuilderInterface $builder,array $options) {
    $builder      
      ->add('validTo',DateType::class,[
        'required'           => FALSE,'format'             => 'dd.MM.yyyy'
      ])
      ->add('infiniteValidTo',CheckBoxType::class,[
        'required'           => FALSE
      ])
      ->addEventListener(FormEvents::PRE_SUBMIT,function (FormEvent $event) {
        $data = $event->getData();
        if (isset($data['infiniteValidTo']) && $data['infiniteValidTo'] === '1') {
          $data['validTo'] = '31.12.9999';
        }
        $event->setData($data);
      });
  }

  /**
   * {@inheritdoc}
   */
  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults([
      'data_class'  => SettingFormModel::class,'constraints' => [
        new Callback([
          'callback' => [$this,'validateFormModel']
        ])
      ]
    ]);
  }

  /**
   * @param SettingFormModel          $object
   * @param ExecutionContextInterface $context
   */
  public function validateFormModel(SettingFormModel $object,ExecutionContextInterface $context): void {
    dump($object);
  }

在离开侦听器方法之前,数据数组具有正确的值(通过转储变量)。

为了以动态方式验证表单,我为数据对象定义了一个回调方法。当数据容器到达方法时,我对 validTo 字段的更改消失了。如果我将该字段更改为一个简单的文本字段,它可以工作,但不适用于日期字段。

调试了很多时间,发现mapFormsToData方法并没有将变化转化为表单对象。

是我的配置出错了还是 symfony 中的错误?其他人对表单有同样的问题吗?

解决方法

我发现了错误。 SettingFormModel 的设置器不正确。修复监听器后,它可以正常工作。

,

您可以使用 post_submit 事件

public function buildForm(FormBuilderInterface $builder,array $options) {
    $builder      
      ->add('validTo',DateType::class,[
        'required'           => FALSE
      ])
      ->add('infiniteValidTo',CheckboxType::class,[
        'required'           => FALSE
      ]);

    $builder->get('infiniteValidTo')->addEventListener(FormEvents::POST_SUBMIT,function (FormEvent $event) {
        if ($event->getForm()->getData()) {
            $event->getForm->getParent()->getData()->setValidTo(new \DateTime('9999-12-31'));
        }
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。