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 ...
실마리?
감사합니다!