当前位置: 首页 > 知识库问答 >
问题:

动态修改表单预设选项以通过symfony2中的验证

冯鸿光
2023-03-14

我希望能够动态添加实体,而无需在EntityType表单类型的选项中预设实体。我需要修改可用的选项,否则会弹出无效值错误。

class MyImageType extends AbstractType {
    public function __construct($em) {
        $this->em = $em;
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults(array(
            'class' => 'stuff/MyImage',
            'choice_label' => 'id',
            'multiple' => true,
            'choices' => [],
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        //
    }

    public function getParent() {
        return EntityType::class;
    }
}

我是这样使用它的:

$builder->add('images', 'stuff\MyImage\Form\Type\MyImageType')

生成的html看起来像这样:

<select id="product_images" name="product[images][]" required="required" class="form-control" multiple="multiple">
</select>

我正在执行一些ajax调用来创建实体并将id附加到下拉列表中,如下所示:

<select id="product_images" name="product[images][]" required="required" class="form-control" multiple="multiple">
    <option value="88" selected="selected">88</option>
</select>

88是现有实体的现有ID。

如果在此之后提交表单,则会显示无效值错误,因为88不在该实体类型的预设选项中。因此,我需要在可用选项中添加88

如果这是一个窗体的子级(Symfony\Component\Form\Form),我可以在FormEvents::PRE_SUBMIT上执行此操作

//..
$img = $em->findOneById(88);
$form->add('images', [
    'class' => 'stuff/MyImage',
    'choice_label' => 'id',
    'multiple' => true,
    'choices' => [$img],
]);

但是在我的例子中,我想在MyImageType类中进行封装。你能告诉我怎么做吗?谢谢

编辑:

在写这个问题的过程中,我找到了解决这个问题的方法。在事件中,我可以像这样更新字段:

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($em) {
    $form = $$event->getForm();
    $form->getParent()->add('images', EntityType::class, $options);
}

我仍然不想回答我自己的问题,因为也许有更好的方法。谢谢

共有2个答案

严宇
2023-03-14

我知道这是一个老问题,我也看过您上次的编辑,但我认为您的解决方案应该更像这样(同时保留“嵌入的”表单名称及其类,因为它不是EntityType,而是自定义类型)。

我在自定义表单类型中添加了这段代码

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options): void {
            $data = $event->getData();
            if ($data === null || $data === []) {
                return;
            }

            // The following works with both "multiple" true and false.
            $entityIds = is_array($data) ? $data : [$data];
            $entities = $this->yourInjectedRepository->findByIds($entityIds);

            // Self-replace this form in its parent with a clone (same name and options) that has the needed choices.
            $options['choices'] = $entities;
            $event->getForm()->getParent()->add(
                $event->getForm()->getName(),
                self::class,
                $options
            );
        });
    }
双志强
2023-03-14

看看我的邮包。

为了解决这个问题,我钩住了PRE_SUBMITForm事件,并重新创建了将提交的选择注入到新的“选择”选项中的子选项。

如果希望在编辑实体时填充字段,则必须在PRE_SET_DATA中执行相同操作。

小心

这样,每个现有提交的实体都将是一个有效值。如果只有一部分实体是可选择的,则还应向字段添加约束。

 类似资料:
  • 在我的netty应用程序中,我使用并提供IP密钥映射: 在通道已经处于活动状态并为客户端服务而不中断与这些客户端的通信后,是否可以更改映射(例如添加新ip)?

  • 说明 此消息用于确认或取消一个预订单 请求地址 http://api.dc78.cn/Api/bk_state 请求方式 GET 请求参数 参数 参数名称 必填 描述 范例 id 预订单编号 state 状态 目前取值有两个:1,确认预定,-1,取消预订 op 操作员 可选 table 预订桌台 可选 返回 status:1-成功,0-失败 请求方式 INI 请求参数 [action] 描述 ac

  • 该怎么修改代码 验证通过

  • 问题内容: 我想要的是类似于文档中的此示例的示例,但是具有唯一的输入,可以通过“ any”,“ name”或“ phone”属性来扮演过滤的三个角色,角色的更改是通过单击锚点完成的。这是准备好的代码http://jsfiddle.net/ubugnu/QuyCU/如何动态更新ng- model属性? 的HTML JS 问题答案: 您可以定义如下:动态更改应绑定到哪个变量(另一个变量在哪里)。 参见

  • 我希望在Windows 2008上实现软件的自动化。自动化软件不必与Windows2008兼容(我可以使用远程桌面)。GUI有两个主要区域,左侧是嵌入图像列表,右侧是显示窗格。显示窗格显示所有嵌入的图像在屏幕上的位置(该程序用于构建人机界面[HMI's])。 我需要单击左侧列表中的每个嵌入图像,并从中提取一些数据。问题是;根据选择的主显示文件,嵌入的图像列表将具有不同的名称和不同的长度。 因此,自

  • 本文向大家介绍vue favicon设置以及动态修改favicon的方法,包括了vue favicon设置以及动态修改favicon的方法的使用技巧和注意事项,需要的朋友参考一下 最近写公司项目时,动态更新favicon 动态更新之前需要有一个默认的favicon。 目前vue-cli搭建的vue项目里面已经有了一个static文件夹,存放静态文件。 favicon图片放到该文件夹下。 然后再in