2012-07-07 61 views
0

很抱歉,我是Symfony的新手。我製作了一張表格,並且它運行良好。我爲圖片的幾個領域(圖片1,圖片2,圖片3等)。我使用了te sfWidgetFormInputFile,並且所有工作都很好。它將文件上傳到需要的地方,並給它一個唯一的名稱。Symfony sfWidgetFormInputFile刪除我的文件

我遇到的問題是,這些字段在mySQL中設置爲默認值「no-pic.png」,以便如果用戶不上傳圖片,它仍然會顯示某些內容在文中。但是每次有人上傳圖片時,它都會刪除我的no-pic.png文件和沒有圖片顯示的帖子,並顯示一個空白的方塊。我想這是因爲它在上傳新圖像之前設置爲「刪除上一張圖像」,以減少服務器上多餘的未使用圖像。

我想知道是否有一種方法可以在將文件從文件夾中刪除之前檢查其值是否爲「no-pic.png」。如果它有幫助,這是我在form.class文件中使用的代碼。

 $this->widgetSchema['picture1'] = new sfWidgetFormInputFile(array('label' => 'Pictures',)); 
    $this->validatorSchema['picture1'] = new sfValidatorFile(array('required' => false, 'path' => sfConfig::get('sf_upload_dir').'/car', 'mime_types' => 'web_images',)); 
    $this->widgetSchema['picture1'] = new sfWidgetFormInputFileEditable(array(
    'label' => 'Pictures', 
    'file_src' => '/uploads/car/'.$this->getObject()->getPicture1(), 
    'is_image' => true, 
    'edit_mode' => !$this->isNew(), 
    'template' => '<div>%file%<br />%input%<br />%delete%%delete_label%</div>', 
    )); 
    $this->validatorSchema['picture_delete'] = new sfValidatorPass(); 
+0

如果允許他們編輯圖片上傳,則不需要第一行。 symfony會照顧你的上傳和刪除,但由於某種原因,它不會讓你同時刪除和上傳一個新文件(至少從我的經驗來說)。 – 2012-07-07 20:34:37

+0

很酷。我拿出第一行,它仍然有效,但我需要能夠自己控制刪除。我剛剛添加了一篇文章,上傳了一張圖片,並且no-pic.png消失了。我甚至試圖讓它只讀。它仍然刪除它。 – djcloud23 2012-07-07 20:55:12

+0

噢,好的。我更明白你想要做什麼。防止這種情況的最簡單方法是綁定控制器中的表單,檢查它是否是刪除,並且圖片不是no-pic.png。如果兩個條件均爲false,則抓取對象並更新它。如果您希望它自動處理刪除併爲您節省,但無法像您想要的那樣真正執行自定義邏輯,bindAndSave非常有用。 – 2012-07-07 21:01:20

回答

0

我找到了解決方法。我進行了頁面檢查,看它是否設置爲no-pic.png,然後在另一個位置顯示no-pic.png。這樣當上傳圖片時,它不會刪除它。 :)感謝您的幫助,但。

+0

很酷的交易。我找到了我使用的代碼並將其發佈以供參考。儘管這很簡單,而symfony完成了所有的工作 – 2012-07-09 18:45:10

1

僅供參考,這裏是我使用的代碼。

$this->setWidget('logo_image', new sfWidgetFormInputFileEditable(array(
    'file_src' => 'uploads/logos/'.$this->getObject()->getFilename(), 
    'edit_mode' => !$this->isNew() 
))); 

$validatorOptions = array(
    'max_size'   => 1024*1024*10, 
    'path'    => sfConfig::get('sf_upload_dir').'/logos', 
    'mime_type_guessers' => array(), 
    'required'   => false 
); 

if ($this->isNew()) 
{ 
    $validatorOptions['required'] = true; 
} 

$this->setValidator('logo_image', new sfValidatorFile($validatorOptions)); 
$this->setValidator('logo_image_delete', new sfValidatorString(array('required' => false)));