Reputation: 11
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!
Upvotes: 1
Views: 449
Reputation: 3253
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.
Upvotes: 1