1

我使用可在实体上上传的 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 ...

有什么线索吗?

谢谢!

4

1 回答 1

1

enctype您是否在视图上的form标签上设置了权利?

enctype="multipart/form-data"

通常这种类型的错误与enctype属性有关。

于 2017-06-06T22:20:50.657 回答