首页 > 解决方案 > Symfony4:'data_class' => null 的更新函数问题,我怎样才能保留我的最后一个文件而不将他更新为 null?

问题描述

我创建了一个表单 ProjectForm 来创建/编辑一个带有 Filetype::class 的项目来上传图像。如果我不想更改我的上传文件,他会变为空,因为 'data_class' => null 所以我不知道如何通过我的最后一个文件来改变这个空数据!

我将尝试将我的最后一个文件存储在 var "$lastfile = $project->getCardImg();" 中 但是当我提交表单时,我的 var 会自动变为 null。

我的表格

$builder
            ->add('title', TextType::class,['required'=> true,'label' => "Titre du nouveau projet"])
            ->add('content', TextareaType::class,['required'=> true,'label' => "Ensemble du contenu en HTML", 'attr' => ['class' => 'summernote']])
            ->add('githubLink', UrlType::class,['required'=> false,'label' => "Lien GitHub du projet"])
            ->add('demoLink', UrlType::class,['required'=> false, 'label' => "Lien de la demo du projet"])
            ->add('year', TextType::class,['required'=> true, 'label' => "Année de conception du projet"])
            ->add('technoUses',  ChoiceType::class, [
                'choices' => [
                    'html' => 'html', 
                    'css' => 'css',
                    'javascript' => 'javascript',
                    'sass' => 'sass',
                    'symfony' => 'symfony',
                ],
                'multiple' => true,
                'expanded' => true,
            ])
            ->add('cardImg', FileType::class, ['required'=> false,'label' => 'Image du projet', 'data_class' => null])
            ->add('description', TextareaType::class,['required'=> true,'label' => "Description du projet"]);
    }

我更新项目的功能

/**
     * Edition d'un projet
     *
     * @Route("/admin/project/{id}/edit", name="admin_edit_project")
     * 
     * @return Response
     */
    public function editProject(Request $request, ObjectManager $manager, Projects $project){

        $form = $this->createForm(ProjectFormType::class, $project);
        $form->handleRequest($request);

        $lastfile = $project->getCardImg();

        dump($lastfile);

        if ($form->isSubmitted() && $form->isValid()) {
            dump($lastfile); 
            if($form->get('cardImg')->getData() == null){
              $project->setCardImg($lastfile);
            }else{
                $file = $form['cardImg']->getData();

                $fileName = str_replace(' ', '_', $project->getTitle()).'.'.$file->guessExtension();

                // Move the file to the directory where brochures are stored
                try {
                    $file->move(
                        $this->getParameter('img_project'),
                        $fileName
                    );
                } catch (FileException $e) {
                    // ... handle exception if something happens during file upload
                }
                $project->setCardImg($fileName);
            }

            $manager->persist($project);
            $manager->flush();

            $this->addFlash(
                'primary',
                'Votre projet a bien était modifié !'
            );

            return $this->redirectToRoute('admin');
        }   

        return $this->render('admin/project/editProject.html.twig', [
            'project' => $project,
            'form' => $form->createView()
        ]);
    }

当我更新我的项目时,我希望不会改变我的形象。

标签: filesymfonyuploadupdates

解决方案


我认为这应该更好

/**
 * Edition d'un projet
 *
 * @Route("/admin/project/{id}/edit", name="admin_edit_project")
 *
 * @return Response
 */
public function editProject(Request $request, ObjectManager $manager, Projects $project) {
    $lastfile=$project->getCardImg();
    $form=$this->createForm(ProjectFormType::class, $project);

    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()) {
        if($project->getCardImg) { //Is either a file or null
            /** @var UploadedFile $file */
            $file=$project->getCardImg();
            //I would suggest to use Ramsey UUID to rename files.
            //$fileName=Uuid::uuid1()->toString().'.'.$file->guessExtension();
            $fileName=str_replace(' ', '_', $project->getTitle()).'.'.$file->guessExtension();

            try {
                $file->move($this->getParameter('img_project'), $fileName);
            } catch(FileException $e) {
                // ... handle exception if something happens during file upload
            }

            $project->setCardImg($fileName);
        } else {
            $project->setCardImg($lastfile);
        }

        //persist isn't needed if you edit.
        //$manager->persist($project);

        //Where did you init $manager?
        //$manager->flush();

        $this->getDoctrine()
             ->getManager()
             ->flush();

        $this->addFlash('primary', 'Votre projet a bien était modifié !');

        return $this->redirectToRoute('admin');
    }

    return $this->render('admin/project/editProject.html.twig', [
        'project'=>$project,
        'form'=>$form->createView(),
    ]);
}

推荐阅读