【问题标题】:Symfony : how to set a file type in an edit form?Symfony:如何在编辑表单中设置文件类型?
【发布时间】:2022-01-19 16:23:42
【问题描述】:

当我想用 symfony 编辑表单中的“事件”时出现此错误:

“表单的视图数据应该是“Symfony\Component\HttpFoundation\File\File”,但它是一个“字符串”。您可以通过将“data_class”选项设置为 null 或添加将“字符串”转换为“Symfony\Component\HttpFoundation\File\File”实例的视图转换器。”

我遵循文档并将其添加到我的控制器中:

$event->setEventImage(
            new File($this->getParameter('images_dir').'/'.$event->getEventImage())
        );

但它并没有改变什么,我不明白为什么。

所以有我的实体:

  /**
     *
     * @ORM\Column (type="string")
     * @Assert\NotBlank(message="Merci de charger un fichier au format image.")
     * @Assert\File(mimeTypes={ "image/*" })
     */
    private $eventImage;
  public function getEventImage(): ?string
    {
        return $this->eventImage;
    }

    public function setEventImage(string $eventImage): self
    {
        $this->eventImage = $eventImage;

        return $this;
    }

还有我的控制器:

 #[Route('/{id}/edit', name: 'events_edit', methods: ['GET','POST'])]
    public function edit(Request $request, Events $event, SluggerInterface $slugger): Response
    {

        $event->setEventImage(
            new File($this->getParameter('images_dir').'/'.$event->getEventImage())
        );

        $form = $this->createForm(EventsType::class, $event);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            /** @var UploadedFile $eventImage */
            $eventImage = $form->get('eventImage')->getData();

            // this condition is needed because the 'eventImage' field is not required
            // so the Image file must be processed only when a file is uploaded
            if ($eventImage) {
                $originalFilename = pathinfo($eventImage->getClientOriginalName(), PATHINFO_FILENAME);
                // this is needed to safely include the file name as part of the URL
                $safeFilename = $slugger->slug($originalFilename);
                $newFilename = $safeFilename . '-' . uniqid() . '.' . $eventImage->guessExtension();

                // Move the file to the directory where images are stored
                try {
                    $eventImage->move(
                        $this->getParameter('images_dir'),
                        $newFilename
                    );
                } catch (FileException $e) {
                    // ... handle exception if something happens during file upload
                }

                // updates the 'eventImage' property to store the image file name
                // instead of its contents
                $event->setEventImage($newFilename);
            }
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('events_index', [], Response::HTTP_SEE_OTHER);
        }

        return $this->renderForm('events/edit.html.twig', [
            'event' => $event,
            'form' => $form,
        ]);
    }

还有我的 EventsType :

public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('title')
            ->add('subtitle')

            ->add('content', CKEditorType::class, [
                'label' => 'content',
                'required' => false,
            ])
            ->add('dateEvent', DateTimeType::class, [
                'widget' => 'single_text',
                'label' => 'Date d\'arrivée : '
            ])
            ->add('place')
            ->add('dateDead', DateType::class, [
                'widget' => 'single_text',
                'label' => 'Date limite d\'inscription : '
            ])
            ->add('numberPersonRestricted')
            ->add('eventImage', FileType::class, [
                'label' => 'Image (fichier image)',
                'required' => false,
                'constraints' => [
                    new File([
                        'maxSize' => '1024k',
                        'mimeTypes' => [
                            'image/*',
                        ],
                        'mimeTypesMessage' => 'Please upload a valid image',
                    ])
                ]
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => Events::class,
        ]);
    }

【问题讨论】:

    标签: php symfony


    【解决方案1】:
            ->add('eventImage', FileType::class, [
                'label' => 'Image (fichier image)',
                'required' => false,
                'constraints' => [
                    new File([
                        'maxSize' => '1024k',
                        'mimeTypes' => [
                            'image/*',
                        ],
                        'mimeTypesMessage' => 'Please upload a valid image',
                    ])
                ]
                'data_class' => null
            ])
    

    在您的表单类型中,您可以将参数 'data_class' => null(如上面的示例)添加到 eventImage 将删除警告并在您添加新文件时工作,但如果您不添加新文件进行编辑,它应该保持不变在你的 bd 中为 null。

    要克服这个问题,以便能够在文件存在时预填充文件字段,可以执行诸如指向文件位置之类的操作。即保存在数据库中的文件的路径。

    所以你正在做的是检查你的视图,看看是否存在数据库中存在的文件路径的文件,然后通过执行类似的操作来预填充它(不要忘记更改你的上传路径):

     {% if form.eventImage.vars.data %} <img src="{{ asset('/uploads/directory/' ~ form.eventImage.vars.data.filename) }}"/>{% endif %}
    

    【讨论】:

    • 我试试这个,但是现在,当我点击上传按钮时,我有这个:“类型为“字符串”的预期参数,属性路径“eventImage”中给出的“null”。
    • 你必须检查你是否真的指向你上传文件的正确目录
    猜你喜欢
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2017-06-26
    • 1970-01-01
    • 2013-11-03
    • 2019-05-24
    • 2018-03-28
    相关资源
    最近更新 更多