• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Podczas tworzenia formularza do edycji już istniejącego elementu formularz nadal oczekuje instancji pliku.

Object Storage Arubacloud
0 głosów
106 wizyt
pytanie zadane 5 czerwca 2019 w PHP przez Hysek Obywatel (1,250 p.)
edycja 5 czerwca 2019 przez Hysek

Witam,
podczas tworzenia formularza do edycji już istniejącego elementu formularz nadal oczekuje instancji pliku.

 

Formularz:

<?php

namespace App\Form;


use App\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class, ['label' => 'Tytuł'])
            ->add('subtitle', TextType::class, ['label' => 'Podtytuł'])
            ->add('image', FileType::class, ['label' => 'Zdjęcie'])
            ->add('description', TextareaType::class, ['label' => 'Opis'])
            ->add('contents', TextareaType::class, ['label' => 'treć'])
            ->add('date', DateType::class, ['label' => 'Data'])
            ->add('author', TextType::class, ['label' => 'Autor'])
            ->add('submit', SubmitType::class, ['label' => 'Dodaj'])
        ;
    }

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

Entity: (skrócone tylko do dotyczącego problemu)

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Gedmo\Mapping\Annotation as Gedmo;

/**
 * @ORM\Entity(repositoryClass="App\Repository\PostRepository")
 */

class Post
{
    /**
     * @ORM\Column(type="string")
     *
     * @Assert\NotBlank(message="Please, upload the product brochure as a JPG file.")
     * @Assert\File(mimeTypes={ "image/jpeg" })
     */
    private $image;

    public function getImage()
    {
        return $this->image;
    }

    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }
}

Controller: (skrócone tylko do dotyczącego problemu)

    /**
     * @Route("/edit/{slug}", name="edit_post")
     * @param Request $request
     * @param Post $post
     * @return Response
     */
    public function editAction(Request $request, Post $post)
    {
        $post->setImage(
            new File($this->getParameter('images_directory').'/'.$post->getImage())
        );

        $editForm = $this->createForm(PostType::class, $post);

        if ($request->isMethod('post')) {
            $editForm->handleRequest($request);

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($post);
            $entityManager->flush();

            return $this->redirectToRoute('blog_single', ['slug' => $post->getSlug()]);
        }

        return $this->render('actionBlog/edit.html.twig', [
            'editForm' => $editForm->createView(),
        ]);
    }

 

Dodam tylko, że jak dam var_dump($post); To plik img jest widoczny! Tylko dlaczego nie ładuje go do formularza??

Zrzut ekranu (jak na nim widać plik jest załadowany, a formularz nadal go wymaga ;O)

Jak ktoś już uświadczył podobnego problemu bardzo proszę o pomoc.

1 odpowiedź

0 głosów
odpowiedź 7 czerwca 2019 przez Hysek Obywatel (1,250 p.)
edycja 7 czerwca 2019 przez Hysek

Dla zainteresowanych udało mi się rozwiązać owy problem nie wiem czy do końca poprawnie ale działa :)

w formularzu dodałem że pole nie jest wymagane

>add('image', FileType::class, [
                'label' => 'Zdjęcie',
                'required' => false
            ])

w entity skasowałem NotBlank

* @Assert\NotBlank(message="Please, upload the product brochure as a JPG file.")

a kontroler zmieniłem następująco:
 

/**
     * @Route("/edit/{slug}", name="edit_post")
     * @param Request $request
     * @param Post $post
     * @param FileUploader $fileUploader
     * @return Response
     */
    public function editAction(Request $request, Post $post, FileUploader $fileUploader)
    {
        $imageName = $post->getImage();

        $post->setImage(
            new File($this->getParameter('images_directory').'/'.$post->getImage())
        );

        $editForm = $this->createForm(EditPostType::class, $post);
        $editForm->handleRequest($request);



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

            $file = $post->getImage();

            if (!$file) {
                $post->setImage($imageName);
            } else {
                $fileName = $fileUploader->upload($file);
                $post->setImage($fileName);
            }

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($post);
            $entityManager->flush();

            return $this->redirectToRoute('blog_single', ['slug' => $post->getSlug()]);
        }

        return $this->render('actionBlog/edit.html.twig', [
            'editForm' => $editForm->createView(),
            'post' => $post,
        ]);
    }

teraz działa na zasadzie że sprawdza czy użytkownik załadował nowe zdjęcie jeśli tak to generuje unikalna nazwę i podmienia w bazie danych uploudując nowy plik, a jeżeli nie wczytał nowego pliku to pobiera pobiera nazwę starego pliku z bazy i zapisuje ją jeszcze.

Jak by ktoś miał pomysł jako można to zrobić by nie ruszało tego pola w bazie gdy użytkownik nie wczyta nowego zdjęcia bardzo proszę o podpowiedź. W tej chwile jeżeli nie pobiorę nazwy z bazy danych i nie zapisze jej ponownie to wstawia mi w to pole null.

Podobne pytania

0 głosów
1 odpowiedź 515 wizyt
pytanie zadane 25 listopada 2018 w PHP przez Vision Początkujący (270 p.)
0 głosów
0 odpowiedzi 119 wizyt
pytanie zadane 21 czerwca 2019 w PHP przez Hysek Obywatel (1,250 p.)
0 głosów
1 odpowiedź 85 wizyt
pytanie zadane 12 października 2018 w PHP przez Q7V Gaduła (4,250 p.)

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...