2017-04-26 3 views
1

stct doctrine uploadable on entity를 사용합니다.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 ...

실마리?

감사합니다!

답변

1

보기의 태그에 오른쪽 enctype을 설정 했습니까?

enctype="multipart/form-data" 

일반적으로이 유형의 오류는 enctype 속성과 관련이 있습니다.