我是这个论坛和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());
}
}
答案 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;