Как позволить пользователю выбрать каталог для загрузки? - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть форма для загрузки изображений в мой движок блога. Файлы загружаются в web / uploads , но я бы хотел добавить виджет «выбор», чтобы пользователи могли выбирать из списка папок, например, «фотографии», «клипарты», «логотипы». .

Вот моя форма

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();
    }
} 

Так, как мне сказать виджету загрузки файла сохранить изображение в другой папке?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2011

Я получил его для работы со следующим кодом:

  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 голосов
/ 09 февраля 2011

Вы можете объединить названные вами имена каталогов ('photos', 'cliparts', 'logos') с sf_upload_dir, как показано в приведенном ниже коде, вам, конечно, нужно будет создать эти каталоги.

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

Кроме того, эти каталоги можно отключить в файле конфигурации app.yml и заставить их вызывать метод sfConfig::get().

...