编辑实体包含文件字段

时间:2016-09-14 12:06:52

标签: php doctrine symfony

我创建了一个带有字段图像的实体Article。 Eveything工作正常,但是当我尝试更新和编辑文章时,我得到了最早的字段,如titre,但没有图像字段。我有一个空图像,我必须上传一个新图像。我想得到最老的图片,顺便说一下,我有数据存储在db上的路径。

这是我的表单 ArticleType.php

<?php
namespace RoubBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;

class ArticleType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('titre')  
           ->add('image', 'file')
        ;
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'RoubBundle\Entity\Article'
        ));
    }
}

这是我的实体 article.php

<?php

namespace RoubBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Article
 *
 * @ORM\Table(name="article")
 * @ORM\Entity(repositoryClass="RoubBundle\Repository\ArticleRepository")
 */
class Article
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     *
     * @Assert\NotBlank(message="Veuillez mettre vos images.")
     * @Assert\File(
     *      maxSize="5242880",
     *      mimeTypes = {
     *          "image/png",
     *          "image/jpeg",
     *          "image/jpg",
     *          "image/gif"
     *      }
     * )
     */
    private $image;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    private $titre;

    public function getTitre()
    {
        return $this->titre;
    }

    public function setTitre($titre)
    {
        $this->titre = $titre;
        return $this;
    }

    public function getImage()
    {
        return $this->image;
    }

    public function setImage($image)
    {
        $this->image = $image;
        return $this;
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
 }

这是在我的 ArticleController.php

public function editAction(Request $request, Article $article)
{
    $article->setImage(
    new File($this->getParameter('images_directory').'/'.$article->getImage()));
    $deleteForm = $this->createDeleteForm($article);
    $editForm = $this->createForm('RoubBundle\Form\ArticleType',  $article);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($article);
        $em->flush();

        return $this->redirectToRoute('article_edit', array('id' =>   $article->getId()));
    }

    return $this->render('RoubBundle:article:edit.html.twig', array(
        'article' => $article,
        'edit_form' => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

如果有人可以帮助我,并且非常感谢你在这里,并在此之前阅读我的问题&lt; 3

1 个答案:

答案 0 :(得分:0)

在处理请求之前,在函数开头的某处保留图像的克隆:

public function editAction(Request $request, Article $article)
{
   $originalImage = clone $article->getImage();
   // .. rest of your function here

当您的表单有效时,请检查您是否有新图像,如果没有,请将旧图像设置为:

if ($editForm->isSubmitted() && $editForm->isValid()) {

  if ($article->getImage()) {
    $article->setImage($originalImage);
  }
  $em = $this->getDoctrine()->getManager();
  $em->persist($article);
  $em->flush();

  return $this->redirectToRoute('article_edit', array('id' =>   $article->getId()));
}

这是伪代码,但你明白了。我在这里使用clone以防你有一个对象的引用,但如果它只是一个路径,你可以简单地赋值。

编辑:明确应该去哪里