Как редактировать загруженное изображение в symfony - PullRequest
0 голосов
/ 01 октября 2018

Я хочу отредактировать существующее изображение, но не смог обновить. Пожалуйста, кто-нибудь может мне помочь.

Я использовал свой тип формы таким образом

$builder->add('picture', FileType::class,['label'=> 'Picture', 'required'=> false, 'data_class'=> null]);
    $builder->add('submit',SubmitType::class, ['label' => 'Submit', 'attr' => ['class'=>'contact100-form-btn']]);

У меня есть следующая сущность

 /**
 * @var string
 *
 * @ORM\Column(name="picture", type="string", length=255, nullable=true)
 *
 */
private $picture;

Я использовал свою форму обработки таким образом

$form = $this->createForm(userType::class, $userEntity, ['action'=>$actionUrl]);
    $form->handleRequest($request);
    if ($form->isSubmitted()) {
        dump($form->getData());die;}

Теперь, когда я использую эту форму в ветке {{ form_widget(form.picture) }} значение отсутствует в поле ввода <input type= "file" name= "picture"> Яне удается получить значение существующего изображения при нажатии кнопки загрузки.

контроллер для действия редактирования

public function editUserData(Request $request, $id) {

    $userEntity = $this->get('app.manage.user_data')->getUserById($id);
    $actionUrl = $this->generateUrl('edit_user_data', ['id' => $id]);
    $form = $this->createForm(userType::class, $userEntity, ['action' => $actionUrl]);
    $form->handleRequest($request);
    if ($form->isSubmitted()) {
        dump($form->getData());die;
        $this->addOrEditUserData($userEntity, $form, $id);
        $this->addFlash("success", "Your have successfully changes data of id=" . $id);

        return $this->redirect($this->generateUrl('display_user_data'));
    }

    return $this->render('@LillyDoo/Narayan/_edit.userData.html.twig', [
        'form' => $form->createView()

    ]);
}

Пожалуйста, помогите мне, как я могу обновить существующее изображение.

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

вот пример обновления файла для данной сущности: в вашем примере попробуйте это:

В вашей сущности:

/**
 * @ORM\Column(type="string")
 * @Assert\File(mimeTypes={ "image/jpeg" , "image/png" , "image/tiff" , "image/svg+xml"})
 */
private $picture;

Здесь мы храним имяфайл в виде строки в базе данных, когда файл загружается с использованием, например, службы, которая позволяет управлять загрузкой файлов в определенном каталоге.

тип вашей сущности:

/**
 * {@inheritdoc}
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('picture', null , array("attr"=> array(), 'required' => false));
}

я установил для второго параметра значение null, поскольку было указано, что он будет вводиться в файл в аннотации сущности.

мы предполагаем, что файлы, которые вы загружаете, находятся в / web / uploads

ваш контроллер должен выглядеть примерно так:

/**  
     *
     * @Route("/{id}/edit", name="your_route_name")
     * @Method({"GET", "POST"})
     */
    public function editAction(Request $request,$id)
    {
      $userEntity = $this->get('app.manage.user_data')->getUserById($id);
      $userEntity = $this->get('app.manage.user_data')->getUserById($id);
      $actionUrl = $this->generateUrl('edit_user_data', ['id' => $id]);
      $editForm= $this->createForm(userType::class, $userEntity, ['action' => 
    $actionUrl]);


      // we must transform the image string from Db  to File to respect the form types
       $oldFileName = $userEntity->getPicture();
       $oldFileNamePath = $this->get('kernel')->getRootDir().'/../web/uploads/'.$userEntity->getPicture();
       $pictureFile = new File($oldFileNamePath);
       $userEntity->setPicture($pictureFile );

       $editForm->handleRequest($request);

        if ($editForm->isSubmitted() && $editForm->isValid()) {
            /*
           *  it means that the user has been set a new picture
           *  else :
           *  we let the old picture
           */
            if($userEntity->getPicture()!=null){
                $newLogoFile = $userEntity->getPicture();
               $fileName = md5(uniqid()).'.'.$newLogoFile ->guessExtension();

             $newLogoFile ->move($this->get('kernel')->getRootDir().'/../web/uploads/', $fileName);
                $newFileName = $fileUploader->upload($newLogoFile);
                $userEntity->setPicture($newFileName);
                $fileUploader->deleteFile($oldFileNamePath);
            }
            /**
             * setting the picturefile because the file is not set . we modify it using the old file name .
             */
            else{
                $userEntity->setPicture($oldFileName);
            }
            $this->getDoctrine()->getManager()->flush();

    }

Надеюсь, это поможет вам.если у вас все еще есть проблемы, просто прокомментируйте

0 голосов
/ 01 октября 2018

Поскольку вы указываете data_class => null на входе "picture", он не будет сопоставлять его с вашей сущностью, поэтому удалите его, и он будет работать.

Если вы не хотите отображать его на сущноститогда комментарий Педрама верен.

См. документы для data_class в https://symfony.com/doc/3.4/forms.html#creating-form-classes -> Установка data_class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...