我在实体上使用stof doctrine uploadable。
我的控制器中的“添加”和“删除/删除”操作运行完美。
我实际上有一个问题来为该实体制作一个编辑表格。
这是我的代码:
<?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;
}
形式:
<?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(),
));
}
错误:
表单的视图数据应该是类的实例 Kreatike \ TutorielBundle \ Entity \ Tutoriel,但是是一个(n)字符串。您可以 通过将“data_class”选项设置为null或by来避免此错误 添加一个视图转换器,将(n)字符串转换为实例 Kreatike \ TutorielBundle \ Entity \ Tutoriel。
的确,我的封面字段包含文件路径的字符串,而不是文件......我的表单获得了fileType。
所以我认为我需要从我的路径中恢复我的文件,以便为表单的字段提供水合...
但我完全不知道该怎么做......
我尽量避免使用data_class =&gt;空...
有任何线索吗?
谢谢!
答案 0 :(得分:1)
您是否在视图上的enctype
标记上设置了正确的form
?
enctype="multipart/form-data"
通常,此类错误与enctype
属性相关。