[英]Symfony update collection form - replace picture doesn't work
(Symfony 5)
我正在嘗試更新具有圖片集合形式的 object。 添加和刪除圖片有效,但更新/替換圖片無效。 當我嘗試替換圖片時,它會添加一張新圖片,但也會保留舊圖片。 我想替換圖片,所以刪除舊的並添加新的。
Controller:
/**
* @Route("/tricks/edit/{slug}", name="trick_edit")
*/
public function editTrick(Trick $trick, Request $request, FileUploader $fileUploader, Filesystem $filesystem): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$originalMediaPictures = new ArrayCollection();
// Create an ArrayCollection of the current mediaPicture objects in the database
foreach ($trick->getMediaPictures() as $mediaPicture) {
$originalMediaPictures->add($mediaPicture);
}
$form = $this->createForm(TrickFormType::class, $trick);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$slugger = new AsciiSlugger();
$trick->setSlug($slugger->slug($trick->getTitle()));
$trick->setUserEditor($this->getUser());
$trick->setEditedDate(new \DateTime('now'));
foreach ($form->get('mediaPictures') as $picture) {
$file = $picture->get('name')->getData();
if (!empty($file)) {
$trickPictureFileName = $fileUploader->upload($file, $this->getParameter('app.trick_picture_directory'));
$mediaPicture = new MediaPicture();
$mediaPicture->setTrick($trick);
$mediaPicture->setName($trickPictureFileName);
$trick->addMediaPicture($mediaPicture);
}
}
foreach ($originalMediaPictures as $mediaPicture) {
if (!$trick->getMediaPictures()->contains($mediaPicture)) {
$trick->getMediaPictures()->removeElement($trick);
$filesystem->remove($this->getParameter('app.trick_picture_directory') . $mediaPicture->getName());
}
}
foreach ($trick->getMediaPictures() as $mediaPicture) {
if (empty($mediaPicture->getName())) {
$trick->removeMediaPicture($mediaPicture);
}
}
$entityManager->persist($trick);
$entityManager->flush();
$this->addFlash('success', 'Trick updated.');
return $this->redirectToRoute('trick_detail', ['slug' => $trick->getSlug()]);
}
return $this->render('trick/edit_trick.html.twig', [
'trick' => $trick,
'trickForm' => $form->createView()
]);
}
父表格:
->add('mediaPictures', CollectionType::class, [
'entry_type' => MediaPictureFormType::class,
'label' => false,
'required' => false,
'mapped' => true,
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false
])
子窗體:
->add('name', FileType::class, [
'label' => 'Picture',
'mapped' => false,
'attr' => [
'class' => 'form-control border border-gray-300 text-gray-900 rounded hover:shadow focus:outline-none focus:bg-gray-100 focus:bg-opacity-50 focus:border-gray-400 py-2 px-4'
],
'multiple' => false,
'row_attr' => ['class' => 'flex flex-col py-5 px-8'],
'empty_data' => '',
'required' => false,
'data_class' => null,
])
這條線有些不對勁:
$trick->getMediaPictures()->removeElement($trick);
您正試圖從它自己的MediaPictures
集合中刪除Trick
(它不在其中)。
也許你的意思是做這樣的事情:
foreach ($originalMediaPictures as $mediaPicture) {
if (!$trick->getMediaPictures()->contains($mediaPicture)) {
// $trick->getMediaPictures()->removeElement($trick);
// remove association from $mediaPicture
$mediaPicture->setTrick(null);
$entityManager->persist($mediaPicture);
// and/or delete $mediaPicture from database
$entityManager->remove($mediaPicture);
$filesystem->remove($this->getParameter('app.trick_picture_directory') . $mediaPicture->getName());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.