2016-08-16 47 views
0

我正在尝试为Cafe实体创建表单。Symfony窗​​体:上传的图像没有以编辑的形式显示

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铲斗返回图像位置fileLocation。然后我将这个文件url设置为Cafe实体的$image属性。

创建咖啡厅工作正常。但是当我尝试编辑咖啡厅时,上传输入是空的。所以,当我点击保存,旧图像被删除。每当我想编辑咖啡馆时,我都需要上传图片。我怎样才能保持图像文件的编辑形式?

回答

1

制作2个字段这一点:

  • 图像 - 对于DB
  • 图像2 - 的形式

Cafe.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() 
    )); 
} 

希望这将有助于

+0

感谢您的解决方案!你能帮我解决这个问题:在编辑窗体中可以显示当前的图像路径吗?以便用户知道已经有一些图像 – blahblah

+0

您可以手动输出此表单http://symfony.com/doc/current/form/form_customization.html。或者添加只读字段'image',我已经更新了我的答案。 –

相关问题