【问题标题】:Symfony form: uploaded image is not shown in edit formSymfony 表单:上传的图像未显示在编辑表单中
【发布时间】:2016-08-16 13:40:17
【问题描述】:

我正在尝试为 Cafe 实体创建表单。

咖啡厅.php

 class Cafe{

    /**
     * @var string $image
     * @Assert\File( maxSize = "1024k", mimeTypesMessage = "Please upload a valid Image")
     * @ORM\Column(name="image", type="string", length=255, nullable=true)
     */
     private $image;
 }

CafeType.php

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, array('label' => 'Name'))
        ->add('image', FileType::class, array(
            'label' => 'Image',
            'data_class' => null,
            'required'    => false
        ))
    ;
}

CafeController.php

public function editAction(Request $request, Cafe $cafe)
{
    $editForm = $this->createForm('AdminBundle\Form\CafeType', $cafe);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $img = $editForm['image']->getData();
        if($img){
            $fileLocation = $this->get('app.s3_file_uploader')->putFileToBucket($img, 'cafe-images/'.uniqid().'/cafe-image');
            $cafe->setImage($fileLocation);
        }

        $em = $this->getDoctrine()->getManager();
        $em->persist($cafe);
        $em->flush();

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

    return $this->render('AdminBundle:Cafe:edit.html.twig', array(
        'cafe' => $cafe,
        'edit_form' => $editForm->createView()
    ));
}

在控制器中,我使用自定义服务将图像保存在 S3 存储桶中,该存储桶返回图像位置文件位置。然后我将此文件 url 设置为 Cafe 实体的 $image 属性。

创建咖啡馆工作正常。但是当我尝试编辑咖啡馆时,上传输入为空。这样当我点击保存时,旧图像就会被删除。每次我想编辑咖啡馆时,我都需要上传 iamge。如何将图像文件保持为编辑形式?

【问题讨论】:

    标签: php forms symfony doctrine


    【解决方案1】:

    为此创建 2 个字段:

    • 图像 - 用于数据库
    • image2 - 用于表格

    咖啡厅.php

     class Cafe{
    
        /**
         * @var string $image
         * @ORM\Column(name="image", type="string", length=255, nullable=true)
         */
         private $image;
    
        /**
         * @var string $image
         * @Assert\File( maxSize = "1024k", mimeTypesMessage = "Please upload a valid Image")
         */
         private $image2;
    
     }
    

    CafeType.php

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, array('label' => 'Name'))
            ->add('image', TextType::class, array(
                'label' => 'Image',
                'readonly' => true,
                'required'    => false
            ))
            ->add('image2', FileType::class, array(
                'label' => 'Image',
                'data_class' => null,
                'required'    => false
            ))
        ;
    }
    

    CafeController.php

    public function editAction(Request $request, Cafe $cafe)
    {
        $editForm = $this->createForm('AdminBundle\Form\CafeType', $cafe);
        $editForm->handleRequest($request);
    
        if ($editForm->isSubmitted() && $editForm->isValid()) {
            $img = $editForm['image2']->getData();
            if($img){
                $fileLocation = $this->get('app.s3_file_uploader')->putFileToBucket($img, 'cafe-images/'.uniqid().'/cafe-image');
                $cafe->setImage($fileLocation);
            }
    
            $em = $this->getDoctrine()->getManager();
            $em->persist($cafe);
            $em->flush();
    
            return $this->redirectToRoute('cafe_index');
        }
    
        return $this->render('AdminBundle:Cafe:edit.html.twig', array(
            'cafe' => $cafe,
            'edit_form' => $editForm->createView()
        ));
    }
    

    希望这会有所帮助

    【讨论】:

    • 感谢您的解决方案!你能帮我解决这个问题:在编辑表单中是否可以显示当前图像路径?以便用户知道已经有一些图像
    • 您可以手动输出此表单symfony.com/doc/current/form/form_customization.html。或者添加只读字段image,我已经更新了我的答案。
    【解决方案2】:

    呜呜呜~

    我建议你看看我这里的回复,第 4 点,editAction 部分: https://stackoverflow.com/a/38945180/6711360

    诚挚的,
    精准

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多