2011-11-06 59 views
0

我需要上傳使用symfony的圖像,但香港專業教育學院沒有能夠使用我的形式做一個圖片...上傳使用形式的symfony

簡化模型是:

​​

現在,即時通訊使用擴展OfferForm的表單,因爲我需要我的表單具有文件小部件而不是字段'pic'和'flyer'的選擇小部件。然後,在保存過程中,我需要創建兩個「圖片」實例來創建與此優惠相關聯的兩個圖片對象。

我還沒有設法找到好的和完整的文件上傳文件......或至少不是我的情況......每一個教程或文章神奇地使用$form->save()方法,一切順利!,但我有多個錯誤,而這樣做......

這是我的表單類:

class myOfferForm extends OfferForm { 

    protected $statusChoices = array(
            'A' => 'Active', 
            'E' => 'Expired', 
            ); 
    protected $validStatus = array('A','E'); 

    public function configure() { 
    parent::configure(); 

    $this->setWidgets(array(
     'id'   => new sfWidgetFormInputHidden(), 
     'name'  => new sfWidgetFormInputText(), 
     'picFile'  => new sfWidgetFormInputFileEditable(array(
          'file_src'  => $this->getObject()->getPicFileSrc(), 
          'is_image'  => true, 
          'with_delete' => !is_null($this->getObject()->getPicFileSrc()) 
                   )), 
     'flyerFile' => new sfWidgetFormInputFileEditable(array(
          'file_src'  => $this->getObject()->getFlyerFileSrc(), 
          'is_image'  => true, 
          'with_delete' => !is_null($this->getObject()->getFlyerFileSrc()) 
                   )), 
     'from'  => new sfWidgetFormDate(array(
          'format'  => '%day%/%month%/%year%', 
          'can_be_empty' => false, 
          'default'  => date('Y/m/d') 
               )), 
     'to'   => new sfWidgetFormDate(array(
          'format'  => '%day%/%month%/%year%', 
          'can_be_empty' => false, 
          'default'  => date('Y/m/d') 
               )), 
     'description' => new sfWidgetFormTextarea(), 
     'status'  => new sfWidgetFormChoice(array(
          'choices' => $this->statusChoices)), 
     'products' => new sfWidgetFormDoctrineChoice(array(
          'model'  => 'Product', 
          'table_method' => 'getActivesOrderedByName', 
          'add_empty' => 'Check associated products', 
          'multiple'  => true, 
                  ) 
                 ), 
    )); 
    $this->widgetSchema->setLabels(array(
     'id'   => '', 
     'name'  => 'Name *:', 
     'picFile'  => 'Picture *:', 
     'flyerFile' => 'Flyer *:', 
     'from'  => 'Valid From *:', 
     'to'   => 'Valid To *:', 
     'description' => 'Description :', 
     'status'  => 'Status *:', 
     'products' => 'Associated Products :', 
    )); 
    $this->setValidators(array(
     'id'   => new sfValidatorChoice(array(
          'choices' => array($this->getObject()->get('id')), 
          'empty_value' => $this->getObject()->get('id'), 
          'required' => false, 
                )), 
     'name'  => new sfValidatorString(), 
     'picFile' => new sfValidatorFile(array(
          'required' => false, 
          'mime_types' => 'web_images', 
          'path'  => WebPromocion::getStaticDirPath().'/', 
          'validated_file_class' => 'OfferValidatedFile', 
                )), 
     'flyerFile' => new sfValidatorFile(array(
          'required' => false, 
          'mime_types' => 'web_images', 
          'path'  => WebPromocion::getStaticDirPath().'/', 
          'validated_file_class' => 'OfferValidatedFile', 
                )), 
     'from'  => new sfValidatorDate(), 
     'to'   => new sfValidatorDate(), 
     'description' => new sfValidatorString(), 
     'status'  => new sfValidatorChoice(array(
          'choices' => $this->validStatus, 
          'required' => true, 
                )), 
     'products' => new sfValidatorDoctrineChoice(array(
               'required' => false, 
               'model' => 'Product', 
               'column' => 'id', 
               'multiple' => true,)), 
    )); 
    $this->validatorSchema['fotoFile_delete'] = new sfValidatorPass(); 
    $this->validatorSchema['flyerFile_delete'] = new sfValidatorPass(); 
    $this->widgetSchema->setIdFormat('offer_form_%s'); 
    $this->widgetSchema->setNameFormat('offer[%s]'); 
    } 
} 

的OfferValidatedFile類:

class OfferValidatedFile extends sfValidatedFile { 
    /** 
    * Generates a random filename for the current file, in case 
    * it already exists. 
    * 
    * @return string A convenient name to represent the current file 
    */ 
    public function generateFilename() 
    { 
    $filename = $this->getOriginalName().$this->getExtension($this->getOriginalExtension()); 
    if (file_exits(WebPromocion::getStaticDirSrc().$filename)) { 
     return sha1($this->getOriginalName().rand(11111, 99999)).$this->getExtension($this->getOriginalExtension()); 
    } else { 
     return $filename; 
    } 
    } 
} 

而且,在我的行動中,我正在做,以及其他的東西:

$this->form->save() 

有一個問題。要約對象在保存表單時沒有任何現有的圖片對象...

我認爲主要問題是我想使用一種形式來處理與兩個相關信息的子映射不同的對象。

那麼,我做錯了什麼?我沒做什麼?有人知道我可以使用這個主題的完整文檔嗎?有沒有一個乾淨的symfonian方式來做到這一點?

回答

1

This documentation適用於您正在使用的symfony和doctrine版本。不幸的是,它們不是爲你簡要介紹初始設置,而是包含一個安裝程序腳本。請注意,這種類型的設置,在'A Gentle Introduction to Symfony'以及'More with Symfony'的其他部分都列出了1.4版本的其他部分。幸運的是,在第一個鏈接中重構腳本的表單類也很冗長,我認爲這會讓您受益匪淺 - 它解釋了模型處理表單的過程(看起來有問題的地方)這可能會使調試對你來說有點神祕。

我建議給它一個很好的閱讀。幾個月前,我跟蹤了這​​個項目,並沒有發現任何問題。

+0

我已閱讀推薦的文檔,它看起來幾乎是我需要的!我真的希望如此,但現在已經很晚了,我要睡了hehehe,明天再試試......在此期間,我接受了這個答案!非常感謝你!! – Throoze

+0

太棒了!如果您遇到任何問題,請隨時按我的方式拍攝問題。 –