表单中的实体类型字段,具有空选择

时间:2016-04-19 13:34:18

标签: php ajax forms symfony

我的目标是创建一个表单,其中包含一个带有空选项的实体类型字段,并使用从ajax调用中检索的值创建。

我有一个名为IngredientType的表单,代表Ingredient实体。它与Recipe实体具有“多对多”关系,从而生成一个名为IngredientInRecipe的新实体。该实体还有一些额外的价值。 ingredientInRecipe表单中的RecipeType字段为CollectionType

ingredient表单中的IngredientInRecipeType字段如下所示:

$builder
    ->add('ingredient', EntityType::class, [
        'choice_label' => 'name',
        'choice_value' => 'uuid',
        'class' => Ingredient::class,
        'choices' => [],
        'mapped' => false,
        'by_reference' => false,
        'attr' => [
            'class' => 'ingredient-select'
        ]
    ])

请注意,由于ajax调用(数据保护)中未返回id,因此我必须依赖实体的uuid字段。此外,'choices'为空。这样做是因为我们可以拥有数以千计的成分,每个食谱中有数十种成分,每个食谱有10个,20个或30个输入,每个输入都有超过数千个值,这只是愚蠢的。

现在这给了我错误:

Symfony\Component\Validator\ConstraintViolation
Object(Symfony\Component\Form\Form).children[ingredientRecipe].children[0].children[ingredient] = e29b7bcc-aa20-415e-a383-c49cd6bdc01d

Caused by:
Symfony\Component\Form\Exception\TransformationFailedException

Unable to reverse value for property path "ingredient": The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique

Caused by:
Symfony\Component\Form\Exception\TransformationFailedException
The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique

所以,你可以看到我添加了'mapped''by_reference'的假值,希望这是原因,然后我可以在控制器中手动找到值,收到相同的错误,所以那不是问题。

我尝试添加DataTransformer,以便uuid转换为Ingredient。这被触发并调用了函数,但看起来表单转换发生在事件链的早期。

然后我尝试弄乱表单本身,认为它不能转换,因为该选项不在选择数组中。这导致我进行了以下尝试。

$builder->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $formEvent) {
    $formData = $formEvent->getData();
    $uuid = $formData['ingredient'];
    $form = $formEvent->getForm();
    $form->remove('ingredient');
    $ingredient = $this->manager->getRepository(Ingredient::class)->findOneBy(['uuid' => $uuid]);

    $form->add('ingredient', EntityType::class, [
        'choice_label' => 'name',
        'class' => Ingredient::class,
        'choices' => [$ingredient->getUuid() => $ingredient],
        'mapped' => false,
        'by_reference' => false,
        'attr' => [
            'class' => 'ingredient-select'
        ]
    ]);
});

不是很干净的代码,但功能就在那里。这也给了我同样的错误。我知道这个代码运行了,而且我知道我现在在选择中有正确的值,因为当我检查symfony分析器(这样一个很棒的工具顺便说一句)我可以看到这个

[
    e29b7bcc-aa20-415e-a383-c49cd6bdc01d => Object(AppBundle\Entity\Ingredient)
]

但它仍然说

The choice "e29b7bcc-aa20-415e-a383-c49cd6bdc01d" does not exist or is not unique

所以我在想,这是别的吗?有没有人可以帮忙解决这个问题?

0 个答案:

没有答案