Создать форму для загрузки изображений - PullRequest
0 голосов
/ 08 февраля 2011

Я хочу позволить пользователям загружать изображения со своих дисков. В поисках по сети вот что я нашел:

Форма:

class ImageForm extends BaseForm
{
  public function configure()
  {
    parent::setUp();

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

    $this->setValidator('file', new sfValidatorFile(
      array(
        'max_size' => 500000,
        'mime_types' => 'web_images',
        'path' => '/web/uploads/assets',
        'required' => true
        //'validated_file_class' => 'sfValidatedFileCustom'
        )

    ));

  }
}

Акция:

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

    if ($request->isMethod('post'))
      if ($this->form->isValid())
      {
           //...what goes here ?
      }

  }

шаблон:

<form action="<?php echo url_for('@images_add') ?>" method="POST" enctype="multipart/data">
<?php echo $form['file']->renderError() ?>
<?php echo $form->render(array('file' => array('class' => 'file'))) ?>
<input type="submit" value="envoyer" />
</form>

Symfony не выдает никаких ошибок, но ничего не передается. Чего мне не хватает?

1 Ответ

2 голосов
/ 08 февраля 2011

Вам не хватает важной части, которая связывает значения с формой:

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

    if ($request->isMethod('post'))
    {
      // you need to bind the values and files to the submitted form
      $this->form->bind(
        $request->getParameter($this->form->getName())
        $request->getFiles($this->form->getName())
      );

      // then check if its valid - if it is valid the validator 
      // should save the file for you
      if ($this->form->isValid())
      {
           // redirect, render a different view, or set a flash message
      }

    }
  } 

Однако вы хотите убедиться, что вы установили формат имени для своей формы, чтобы вы могли получить значения ифайлы в моде ... В вашем методе configure вам нужно вызвать setNameFormat:

public function configure()
{
   // other config code

   $this->widgetSchema->setNameFormat('image[%s]');
}

Также в configure вам не нужно вызывать parent::setUp() ... Это вызывается автоматически ина самом деле то, что вызывает метод configure.

LLstly, вам нужно исправить разметку - вы выберете имя формы из вашего тега:

<form action="<?php echo url_for('@images_add') ?>" name="<?php echo $form->getName() ?>" method="POST" enctype="multipart/data">

Лично мне нравится использовать формуобъект для генерации, а также он выглядит чище на мой взгляд:

<?php echo $form->renderFormTag(
  url_for('@images_add'),
  array('method' => 'post') // any other html attriubutes
) ?>

Он будет обрабатывать атрибуты кодировки и имени в зависимости от того, как вы настроили форму.

...