gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:20:35 25 4
gpt4 key购买 nike

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

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。

如果我在那之后提交表单,invalid value 错误会出现,因为 88 不在该实体类型的预设 choices 中.所以我需要在可用选项中添加 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);
}

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

最佳答案

看看我的 FormBundle .

为了解决这个问题,我 Hook 了 PRE_SUBMIT FormEvent,并重新创建了将提交的选项注入(inject)新的“选择”选项的子项。

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

注意

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

关于symfony - 在 symfony2 中动态修改表单预设选项以通过验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38615876/

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