创建用于上载图像的表单

时间:2011-02-08 15:56:53

标签: forms file-upload symfony1

我想让用户从他们的驱动器上传图片。在网上搜索,这是我发现的:

表格:

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 个答案:

答案 0 :(得分:2)

你缺少一个重要的部分,它将值绑定到表单:

  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方法。

LAstly,你需要更正标记 - 你从你的标签中发出表格名称:

<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
) ?>

它将根据您配置表单的方式计算出编码和名称属性。