2011-02-09 19 views
0

ブログエンジンで画像をアップロードするためのフォームがあります。ファイルはウェブ/アップロードにアップロードされますが、ユーザーがフォルダのリスト(写真、クリップアート、ロゴなど)から選択できるように、「選択」ウィジェットを追加したいと思います。ユーザーにアップロードディレクトリを選択させる方法を教えてください。

ここに私のフォームは

class ImageForm extends BaseForm 
{ 
    public function configure() 
    { 
    $this->widgetSchema->setNameFormat('image[%s]'); 

    $this->setWidget('file', new sfWidgetFormInputFileEditable(
     array(
     'edit_mode'=>false, 
     'with_delete' => false, 
     'file_src' => '', 
     ) 
    )); 

    $this->setValidator('file', new mysfValidatorFile(
     array(
     'max_size' => 500000, 
     'mime_types' => 'web_images', 
     'path' => 'uploads', 
     'required' => true 
     ) 

    )); 

    $this->setWidget('folder', new sfWidgetFormChoice(array(
     'expanded' => false, 
     'multiple' => false, 
     'choices' => array('photos', 'cliparts', 'logos') 
     ) 
    )); 

    $this->setValidator('folder', new sfValidatorChoice(array(
     'choices' => array(0,1,2) 
    ))); 


    } 


} 

だとここに私のアクションです:

public function executeAjout(sfWebRequest $request) 
    { 
    $this->form = new ImageForm(); 

    if ($request->isMethod('post')) 
    { 
     $this->form->bind(
     $request->getParameter($this->form->getName()), 
     $request->getFiles($this->form->getName()) 
    ); 

     if ($this->form->isValid()) 
     { 
      $this->form->getValue('file')->save(); 
      $this->image = $this->form->getValue('file'); 
     } 

    } 

私はカスタムファイルのバリデータを使用しています:

class mySfValidatorFile extends sfValidatorFile 
{ 

    protected function configure($options = array(), $messages = 
array()) 
    { 
     parent::configure(); 
     $this->addOption('validated_file_class', 
'sfValidatedFileFab'); 
    } 

} 

class sfValidatedFileFab extends sfValidatedFile 
{ 
    public function generateFilename() 
    { 
     return $this->getOriginalName(); 
    } 
} 

それでは、ファイルアップロードウィジェットにイメージを別のフォルダに保存するように指示するにはどうすればよいですか?

答えて

0

私はそれが次のコードで動作するようになった:ImageFormで

public function executeAdd(sfWebRequest $request) 
    { 
    $this->form = new ImageForm(); 

    if ($request->isMethod('post')) 
    { 
     $this->form->bind(
     $request->getParameter($this->form->getName()), 
     $request->getFiles($this->form->getName()) 
    ); 

     if ($this->form->isValid()) 
     { 
      //quel est le dossier ? 
      switch($this->form->getValue('folder')) 
      { 
      case 0: 
       $this->folder = '/images/clipart/'; 
       break; 
      case 1: 
       $this->folder = '/images/test/'; 
       break; 
      case 2: 
       $this->folder = '/images/program/'; 
       break; 
      case 3: 
       $this->folder = '/images/smilies/'; 
       break; 

      } 

      $filename = $this->form->getValue('file')->getOriginalName(); 
      $this->form->getValue('file')->save(sfConfig::get('sf_web_dir').$this->folder.$filename); 

      //path : 
      $this->image = $this->folder.$filename; 
     } 

    } 
0

あなたが言ったディレクトリ名( 'photos'、 'cliparts'、 'logos')を下のコードのようにsf_upload_dirに連結することができます。もちろんこれらのディレクトリを作成する必要があります。

$this->validatorSchema['file'] = new sfValidatorFile(
      array('path' => sfConfig::get('sf_upload_dir' . '/' . $path) 
     )); 

また、あなたはapp.ymlの設定ファイルでこれらのディレクトリののdetailesを持つことができ、それらをsfConfig::get()メソッドを呼び出して取得します。

+0

?しかし、私はまだフォームを作成するときに$パスがありません... – Manu

関連する問題