我使用可在实体上上传的 stof 学说。
我的控制器中的“添加”和“删除/删除”操作运行完美。
我实际上有一个问题来为该实体制作一个编辑表单。
这是我的代码:
<?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';
}
}
编辑动作:
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 或添加将 a(n) 字符串转换为 Kreatike\TutorielBundle\Entity\Tutoriel 实例的视图转换器来避免此错误。
事实上,我的封面字段包含文件路径的字符串,而不是文件......我的表单得到一个文件类型。
所以我认为我需要从我的路径中恢复我的文件以补充表单的字段......
但我完全不知道该怎么做......
我尽量避免 data_class => null ...
有什么线索吗?
谢谢!