使用symfony中的表单上传图片

时间:2011-11-06 04:58:34

标签: php doctrine symfony-1.4 symfony-forms

我需要使用symfony上传图片,但我还是无法使用我的表单...

简化模型是:

Offer:
  columns:
    id:
    name:
    pic:
    flyer:
    description:
      .
      .
      .
  relations:
    Picture:
      local: pic
      foreign: id
      type: one
    Picture_2:
      class: Picture
      local: flyer
      foreign: id
      type: one
Picture:
  columns:
    id:
    path:
    name:
      .
      .
      .

现在,我正在使用扩展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()

有一个问题。在保存表单时,Offer对象没有任何现有的Picture对象....

我认为主要的问题是我想使用一种形式来处理与两个不同对象相关的信息的下载。

那么,我做错了什么?我不做什么?有人知道我可以使用的关于这个主题的完整文档吗?有没有干净的 symfonian 方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

This documentation用于您正在使用的symfony和doctrine的版本。不幸的是,它们不是概述初始设置,而是包含安装程序脚本。请注意,这种类型的设置 在“A Gentle Introduction to Symfony”的其他地方以及版本1.4的“More with Symfony”的其他部分中列出。幸运的是,在第一个链接中重构脚本的表单类也有一个相当冗长的看法,我认为这样会对你有所帮助 - 它解释了模型对表单的处理(你似乎在哪里遇到问题),这可能会让调试变得不那么神秘。

我建议给它一个好的阅读。几个月前,我在一个项目中进行了这项工作,并且没有任何问题。