2016-08-16 2 views
0

Я пытаюсь создать форму для объекта Cafe.Symfony form: Загруженное изображение не отображается в форме редактирования

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 в $image свойство Cafe entity.

Создание кафе отлично работает. Но когда я пытаюсь редактировать кафе, загрузка ввода пуста. Поэтому, когда я нажимаю «Сохранить», старое изображение удаляется. Мне нужно загружать iamge каждый раз, когда я хочу редактировать кафе. Как сохранить файл изображения в форме редактирования?

ответ

1

сделать 2 поля для этого:

  • изображения - для дб
  • image2 - для формы

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. Или добавьте поле readonly 'image', я обновил свой ответ. –

Смежные вопросы