загрузка картинки с помощью форм в symfony - PullRequest
0 голосов
/ 06 ноября 2011

Мне нужно загрузить изображения с помощью 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'.В процессе сохранения мне нужно создать два экземпляра Picture для создания двух объектов Picture, связанных с этим предложением.

Мне не удалось найти хорошую и полную документацию по загрузке файлов ...или, по крайней мере, не в моем случае ... каждый учебник или статья волшебным образом использует метод $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()

Естьпроблема.Объект предложения не имеет какого-либо существующего объекта Picture, с которым необходимо связать время сохранения формы ....

Я думаю, что основная проблема заключается в том, что я хочу использовать одну форму для обработки представления информации, связанной ск двум различным объектам.

Итак, что я делаю не так?что я не делаю?Кто-нибудь знает полную документацию по этому вопросу, которую я мог бы использовать?Есть ли чистый symfonian способ сделать это?

1 Ответ

1 голос
/ 06 ноября 2011

Эта документация предназначена для используемой вами версии Symfony и доктрины. К сожалению, вместо того, чтобы описать начальную настройку для вас, они включают в себя скрипт установщика. Обратите внимание, что этот тип настройки описан в другом месте как в A, а также в других частях ' More с Symfony ' для версии 1.4. К счастью, в первой ссылке есть довольно многословный взгляд на рефакторинг класса формы скрипта, который, как мне кажется, принесет вам немало пользы - он достаточно хорошо объясняет обработку формы в форме (где у вас возникают проблемы) что может сделать отладку немного менее загадочной для вас.

Рекомендую прочесть. Я следовал за этим для проекта несколько месяцев назад и вышел из него без каких-либо проблем.

...