Symfony 3 - Stof Doctrine Extension Uploadable : Edit file

455 Views Asked by At

I use stof doctrine uploadable on entity.

The "add" and "remove/delete" actions in my controller run perfectly.

I actualy have a problème to make an edit form for that entity.

Here's my code:

<?php

namespace Kreatike\TutorielBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

use Doctrine\Common\Collections\ArrayCollection;

/**
 * Tutoriel
 *
 * @ORM\Table(name="tutoriel")
 * @ORM\Entity(repositoryClass="Kreatike\TutorielBundle\Repository\TutorielRepository")
 * @Gedmo\Uploadable(allowOverwrite=false, appendNumber=true, filenameGenerator="SHA1", path="uploads/KreatikeTutorielBundle/Tutoriel/covers")
 */
class Tutoriel
{

(...)

    /**
     * @ORM\Column(name="cover", type="string")
     * @Gedmo\UploadableFilePath
     */
    private $cover;

(...)

    /**
     * Set cover
     *
     * @param string $cover
     *
     * @return Tutoriel
     */
    public function setCover($cover)
    {
        $this->cover = $cover;

        return $this;
    }

    /**
     * Get cover
     *
     * @return string
     */
    public function getCover()
    {
        return $this->cover;
    }

Form:

<?php

namespace Kreatike\TutorielBundle\Form;

use Symfony\Component\Form\AbstractType;

use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
//use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
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\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\FileType;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;


use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TutorielType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('titre',              TextType::class)

            ->add('cover',               FileType::class)
           (...)

            ->add('Valider', SubmitType::class)
            //->add('date') (la date est ajoutée via la fonction __construct de l'entité)
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Kreatike\TutorielBundle\Entity\Tutoriel'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'kreatike_tutorielbundle_tutoriel';
    }


}

EditAction:

public function editAction($slug, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $tutoriel = $em->getRepository('KreatikeTutorielBundle:Tutoriel')->findOneBy(array('slug' => $slug));

    if($tutoriel===null)
    {
        throw new NotFoundHttpException('Le Tutoriel n\'hexiste pas');
    }


    $form = $this->get('form.factory')->create(TutorielEditType::class, $tutoriel);

    if($request->isMethod('POST') && $form->handleRequest($request)->isValid())
    {

        $uploadableManager = $this->get('stof_doctrine_extensions.uploadable.manager');


        $em->persist($tutoriel);
        $uploadableManager->markEntityToUpload($tutoriel, $tutoriel->getCover());

        $em->flush();

        $request->getSession()->getFlashBag()->add('notice', 'Le tutoriel a bien été modifié.');

        return $this->redirectToRoute('kreatike_tutoriel_view', array(
            'slug'=>$tutoriel->getSlug(),
            ));
    }


    return $this->render('KreatikeTutorielBundle:Tutoriel:edit.html.twig', array(
        'tutoriel'=>$tutoriel,
        'form'=>$form->createView(),
        ));
}

The error:

The form's view data is expected to be an instance of class Kreatike\TutorielBundle\Entity\Tutoriel, but is a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) string to an instance of Kreatike\TutorielBundle\Entity\Tutoriel.

Indeed my cover field containt the string of the file's path, not a file... and my form get a fileType.

So I think that I need to recover my file from my path in order to hydrate the form's field...

But I have absolutely no idea how to do that...

I try to avoid data_class => null...

Any clue?

Thanks!

1

There are 1 best solutions below

0
On

Did you set the right enctype on the form tag on the view?

enctype="multipart/form-data"

Usually this type of errors are related to the enctype attribute.