我创建了一个带有字段图像的实体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
答案 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
以防你有一个对象的引用,但如果它只是一个路径,你可以简单地赋值。
编辑:明确应该去哪里