Symfony2,编辑表格,上传图片

时间:2014-04-06 19:30:02

标签: php forms symfony file-upload edit

我是这个论坛和symfony的新手。经过几个小时的搜索,我找不到解决问题的方法。

问题:

我的编辑表单存在问题。创建表单工作正常!我有一个项目的编辑表格。当我更改某些字段时,如标题然后提交。画面消失了,因为我还没有选择一个......

我每次都要选择当前的图片,因为它不是预选的。

我需要什么: 1.我需要在文件上传按钮上方预览当前图片。 2.当我更改编辑表单的数据时,预览图片不应该改变!

有没有办法实现这个目标?我需要你的帮助,thx:)

我的表格看起来像这样。

    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
            ->add('title', 'text', array('attr' => array(
                    'label' => 'Titel',
                    'class' => 'input-xxlarge'
        )))
            ->add('short', 'text', array('attr' => array(
                    'label' => 'Beschreibung',
                    'class' => 'input-xxlarge'
        )))
            ->add('content', 'text', array('attr' => array(
                    'label' => 'Inhalt',
                    'class' => 'input-xxlarge'
        )))
            ->add('category', 'choice', array('choices' =>
                array('Tuning' => 'Tuning', 'Gas' => 'Gas', 'Reparatur' => 'Reparatur'), 'required' => true), array('attr' => array(
                    'label' => 'Kategorie',
                    'class' => 'input-xxlarge'
        )))
            ->add('active', 'choice', array(
                'choices' => array('0' => 'Nein', '1' => 'Ja'),
                'preferred_choices' => array('Nein'),
                'attr' => array(
                    'label' => 'aktivieren',
                    'class' => 'input-small'
        )))
            ->add('picture', NULL, array('label' => 'Bild', 'data_class' => null, 'required' => false,
            ))
  //Need i workaround here...

}

修改

这是我的实体

 /**
 * @ORM\OneToMany(targetEntity="Pictures", mappedBy="project")
 */
protected $pictures;

public function __construct() {
    $this->pictures = new ArrayCollection();
    $this->created = new \DateTime();
}

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255)
 */
private $title;

/**
 * @var string
 *
 * @ORM\Column(name="short", type="text")
 */
private $short;

/**
 * @var string
 *
 * @ORM\Column(name="content", type="text")
 */
private $content;

/**
 * @var string
 *
 * @ORM\Column(name="category", type="string", length=255)
 */
private $category;

/**
 * @var string
 *
 * @Assert\File(maxSize = "1024k", mimeTypesMessage = "Please upload a valid Picture")
 * @ORM\Column(name="picture", type="string", length=255)
 */
private $picture;

/**
 * @var integer
 *
 * @ORM\Column(name="active", type="smallint")
 */
private $active;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created", type="datetime")
 */
private $created;

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

/**
 * Set title
 *
 * @param string $title
 * @return Project
 */
public function setTitle($title) {
    $this->title = $title;

    return $this;
}

/**
 * Get title
 *
 * @return string 
 */
public function getTitle() {
    return $this->title;
}

/**
 * Set short
 *
 * @param string $short
 * @return Project
 */
public function setShort($short) {
    $this->short = $short;

    return $this;
}

/**
 * Get short
 *
 * @return string 
 */
public function getShort() {
    return $this->short;
}

/**
 * Set content
 *
 * @param string $content
 * @return Project
 */
public function setContent($content) {
    $this->content = $content;

    return $this;
}

/**
 * Get content
 *
 * @return string 
 */
public function getContent() {
    return $this->content;
}

/**
 * Set category
 *
 * @param string $category
 * @return Project
 */
public function setCategory($category) {
    $this->category = $category;

    return $this;
}

/**
 * Get category
 *
 * @return string 
 */
public function getCategory() {
    return $this->category;
}

/**
 * Set picture
 *
 * @param string $picture
 * @return Project
 */
public function setPicture($picture) {
    $this->picture = $picture;

    return $this;
}

/**
 * Get picture
 *
 * @return string 
 */
public function getPicture() {
    return $this->picture;
}

/**
 * Set active
 *
 * @param integer $active
 * @return Project
 */
public function setActive($active) {
    $this->active = $active;

    return $this;
}

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

/**
 * Set created
 *
 * @param \DateTime $created
 * @return Project
 */
public function setCreated($created) {
    $this->created = $created;

    return $this;
}

/**
 * Get created
 *
 * @return \DateTime 
 */
public function getCreated() {
    return $this->created;
}


/**
 * Add pictures
 *
 * @param \pspiess\ContentBundle\Entity\Pictures $pictures
 * @return Project
 */
public function addPicture(\pspiess\ContentBundle\Entity\Pictures $pictures)
{
    $this->pictures[] = $pictures;
    $pictures->setProject($this);
    return $this;
}

/**
 * Remove pictures
 *
 * @param \pspiess\ContentBundle\Entity\Pictures $pictures
 */
public function removePicture(\pspiess\ContentBundle\Entity\Pictures $pictures)
{
    $this->pictures->removeElement($pictures);
}

/**
 * Get pictures
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getPictures()
{
    return $this->pictures;
}

/**
 * Override toString() method to return the name of the project title
 * @return string title
 */
public function __toString()
{
    return $this->title;
}

public function getFullPicturePath() {
    return null === $this->picture ? null : $this->getUploadRootDir() . $this->picture;
}

protected function getUploadRootDir() {
    // the absolute directory path where uploaded documents should be saved
    return $this->getTmpUploadRootDir() . $this->getId() . "/";
}

protected function getTmpUploadRootDir() {
    // the absolute directory path where uploaded documents should be saved
    return __DIR__ . '/../../../../web/resources/images/project/';
}

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function uploadPicture() {
    echo $this->picture;
    // the file property can be empty if the field is not required
    if (null === $this->picture) {
        return;
    }
    if (!$this->id) {
        $this->picture->move($this->getTmpUploadRootDir(), $this->picture->getClientOriginalName());
    } else {
        $this->picture->move($this->getUploadRootDir(), $this->picture->getClientOriginalName());
    }
    $this->setPicture($this->picture->getClientOriginalName());
}

/**
 * @ORM\PostPersist()
 */
public function movePicture() {
    if (null === $this->picture) {
        return;
    }
    if (!is_dir($this->getUploadRootDir())) {
        mkdir($this->getUploadRootDir());
    }
    copy($this->getTmpUploadRootDir() . $this->picture, $this->getFullPicturePath());
    unlink($this->getTmpUploadRootDir() . $this->picture);
}

/**
 * @ORM\PreRemove()
 */
public function deletePicture() {
    if (file_exists($this->getFullPicturePath())) {
        unlink($this->getFullPicturePath());
    }
    if (is_dir($this->getUploadRootDir())) {
        //rmdir($this->getUploadRootDir());
    }
}

2 个答案:

答案 0 :(得分:0)

您应该查看http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html,看起来您还没有添加任何内容,因此值得您一试。

您的实体缺少一些所需的方法和属性,看起来您的表单定义也不是很正确。文档非常擅长解释初学者的内容,所以请确保给他们一个看看。

答案 1 :(得分:0)

解决我的问题。

您需要2个变量,一个字符串将路径保存到您的DB中,另一个Assert \ File类型用于der Upload。

以下是代码段:

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
private $path;

/**
 * @Assert\File(maxSize = "1024k", mimeTypesMessage = "Please upload a valid Picture")
 */
private $picture;