gpt4 book ai didi

php - 具有文件类型字段editAction的Symfony 3表单集合实体

转载 作者:行者123 更新时间:2023-12-05 02:18:19 25 4
gpt4 key购买 nike

当存在具有 fileType 字段的实体集合时,如何正确处理表单更新。我根据 Symfony upload docs .实体创建工作完美,但编辑操作失败,因为没有选择文件并且 symfony 尝试用文件字段上的空值更新集合实体。

AppBundle\Entity\Product:
type: entity
# ...
oneToMany:
images:
targetEntity: Image
mappedBy: product

表格:

// AppBundle\Form\ProductType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add(
'images',
CollectionType::class,
[
'entry_type' => ImageType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'entry_options' => ['label' => false],
'label_attr' => [
'data-feature' => 'editable',
],
]
);
}

// AppBundle\Form\ImageType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, ['required' => false])
// another fields...
}

行动:

// AppBundle\Controller\Backend\ProductController
// ...
public function editAction(Request $request, EntityManagerInterface $em, Product $product)
{
$editForm = $this->createForm('AppBundle\Form\ProductType', $product);
$editForm->handleRequest($request);

$originalImages = new ArrayCollection();

foreach ($product->getImages() as $image) {
$originalImages->add($image);
}

if ($editForm->isSubmitted()) {
if ($editForm->isValid()) {
foreach ($originalImages as $image) {
if (false === $product->getImages()->contains($image)) {
$em->remove($image);
}
}

$em->flush();

$this->addFlash('success', 'Success');
} else {
$this->addFlash('warning', 'Error saving');
}

return $this->redirectToRoute('backend_product_edit', ['id' => $product->getId()]);
}
}
// ...

在我看来我需要在某处取消设置空文件字段,但我不知道在哪里...(

附言我知道我可以使用像 VichUploaderBundle 这样的包,但我想了解它是如何工作的,以及我做错了什么!附言对不起我的英语

最佳答案

修改ImageType形式彻底解决了我的问题

// AppBundle\Form\ImageType   
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, ['required' => false, 'data_class' => null]])
// another fields...
;
// adding this forces to use old file if there is no file uploaded
$builder->get('file')->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
if (null === $event->getData()) {
$event->setData($event->getForm()->getData());
}
});
}

关于php - 具有文件类型字段editAction的Symfony 3表单集合实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730015/

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