私はstct doctrineをエンティティでアップロード可能なものを使用します。Symfony 3 - Stof Doctrine Extensionアップロード可能:ファイル編集
コントローラの「追加」と「削除/削除」アクションは完全に実行されます。
私は実際にそのエンティティの編集フォームを作るためのプロブレムを持っています。
ここに私のコードです:
<?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(),
));
}
エラー:
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.
実際、私のカバーフィールドには、ファイルではなくファイルのパスの文字列が含まれています...そして、私のフォームはfileTypeを取得します。
だから私は
...私は、フォームのフィールドを水和するために私のパスからの私のファイルを回復する必要があると思います。しかし、私はそれを行うにはどのように絶対にないアイデアを持っていない...
私がしよう回避するdata_class => null ...
手がかりはありますか?
ありがとうございます!