2014-12-04 58 views
2

因此,我有一個文檔實體存儲文件上傳(當前僅用於圖像),該文件上傳在整個博客項目中使用。現在對於我希望能夠上傳和選擇基本上除了文件大小之外幾乎沒有限制的圖像的文章,但是對於一個類別,我只想使用正方形或非橫向圖像而不是縱向圖像。Symfony對同一實體上不同使用情況的不同驗證

文檔實體看起來像這樣

class Document 
{ 
/** 
* @var integer 
*/ 
private $id; 


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

/** 
* @var string 
*/ 
private $path; 

private $webPath; 

private $filename; 

/** 
* Set name 
* 
* @param string $name 
* @return Document 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

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

/** 
* Set path 
* 
* @param string $path 
* @return Document 
*/ 
public function setPath($path) 
{ 
    $this->path = $path; 

    return $this; 
} 

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

public function setFullFilename() 
{ 
    $this->filename = $this->id . '.' . $this->path; 
} 

public function getFilename() 
{ 
    return $this->filename; 
} 

public function getAbsolutePath() 
{ 
    //return null === $this->path ? null : $this->getUploadRootDir(). '/' . $this->path; 
    return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->id.'.'.$this->path; 
} 

public function getWebPath() 
{ 
    return null === $this->path ? null : $this->getUploadDir() . '/'; 
} 

public function getUploadRootDir() 
{ 
    return __DIR__.'/../../../../web/'.$this->getUploadDir(); 
} 

public function getUploadDir() 
{ 
    return 'bundles/pgblog/images/uploads'; 
} 

private $file; 

private $temp; 

public function setFile(UploadedFile $file = null) 
{ 
    $this->file = $file; 

    if(is_file($this->getAbsolutePath())) 
    { 
     $this->temp = $this->getAbsolutePath(); 
    } 
    else { 
     $this->path = 'initial'; 
    } 
} 

public function getFile() 
{ 
    return $this->file; 
} 

public function preUpload() 
{ 
    if(null !== $this->getFile()) 
    { 
     $this->path = $this->getFile()->guessExtension(); 

     $this->setMimetype(); 
     $this->setSize(); 
     /* 
     $filename = sha1(uniqid(mt_rand(), true)); 
     $this->path = $filename . '.' . $this->getFile()->guessExtension(); 
     */ 
    } 
} 

public function upload() 
{ 
    if(null === $this->getFile()) 
    { 
     return; 
    } 

    if(isset($this->temp)) 
    { 
     unlink($this->temp); 
     $this->temp = null; 
    } 

    $this->getFile()->move($this->getUploadRootDir(), $this->id . '.' . $this->getFile()->guessExtension()); 

    $this->file = null; 
} 

public function storeFilenameForRemove() 
{ 
    $this->temp = $this->getAbsolutePath(); 
} 

public function removeUpload() 
{ 
    if(isset($this->temp)) 
    { 
     unlink($this->temp); 
    } 
} 

public function __toString() 
{ 
    return $this->name; 
} 
/** 
* @var string 
*/ 
private $mimetype; 


/** 
* Set mimetype 
* 
* @param string $mimetype 
* @return Document 
*/ 
public function setMimetype() 
{ 
    $this->mimetype = $this->getFile()->getMimeType(); 

    return $this; 
} 

/** 
* Get mimetype 
* 
* @return string 
*/ 
public function getMimetype() 
{ 
    return $this->mimetype; 
} 
/** 
* @var integer 
*/ 
private $size; 


/** 
* Set size 
* 
* @param integer $size 
* @return Document 
*/ 
public function setSize() 
{ 
    $this->size = $this->getFile()->getSize(); 

    return $this; 
} 

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

}

我使用的文件上傳和文章/類別創建單獨的形式。當創建一個文章或類別,文件可以從當前所有文件

這裏的表單類型的列表中選擇了第二條

class ArticleType extends AbstractType 
{ 

    ... 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('title') 
     ->add('text') 
     ->add('tags') 
     ->add('category') 
     ->add('image') 
    ; 
} 

... 
} 

和文章實體

class Article 
{ 
... 

/** 
* Set image 
* 
* @param \Acme\UtilBundle\Entity\Document $image 
* @return Article 
*/ 
public function setImage(\PG\BlogBundle\Entity\Document $image = null) 
{ 
    $this->image = $image; 

    return $this; 
} 

/** 
* Get image 
* 
* @return \Acme\BlogBundle\Entity\Document 
*/ 
public function getImage() 
{ 
    return $this->image; 
} 
} 

Article是相關到Document通過單向多對一關係

manyToOne: 
    image: 
     targetEntity: Document 
     joinColumn: 
      name: document_id 
      referencedColumnName: id 

所以在表單中可以通過select來設置文件。對於這篇文章,這很好,因爲我希望能夠使用任何圖像作爲附件,但是對於類別,我只想要像前面所說的那樣是正方形的文件。 我想過對類別圖像使用驗證,但由於圖像是通過選擇選擇的,實際數據只是一個字符串(上載表單中給出的文件名)而不是它自身的圖像,所以驗證返回錯誤

Catchable Fatal Error: Argument 1 passed to Acme\BlogBundle\Entity\Category::setImage() must be an instance of Acme\BlogBundle\Entity\Document, string given... 

所以我的問題是,我該如何限制類形成圖像選項只有正方形圖片,我如何驗證這個正常嗎?

我只想使用方形圖像進行分類的原因是,我可以順便顯示一個很好的對稱列表。

在此先感謝!

回答

0

將圖像尺寸存儲在文檔實體中(長度,寬度)。

通過這種方式,在獲取文檔集合的類別表單時,您可以過濾長度爲== width的圖像文檔,因此只顯示適當的文檔。

對於驗證,您有一些選項,最好的開始地點是here。在你的地方,我會考慮validation groups

+0

哇,答案是驚人的簡單。 但是有沒有一種解決方案不能將文檔實體「限制」爲只有圖像?我知道我沒有真正把這個問題放在我的問題上。目前我的文檔實體只保存圖像,因爲我沒有將它用於其他任何東西,但我打算使用整個網站上的每種類型的文件。 – Kable 2014-12-05 15:21:50