Сохранение встраивания sfForm - PullRequest
3 голосов
/ 10 марта 2011

Я делаю форму, которая состоит из текста и загружаю файлы.Проблема в том, что файл не был сохранен в db (поле blob), потому что клиент не хотел, поэтому я сделал UploadFileForm, чтобы очистить его и выполнить логику загрузки и сохранения в таблицу файлов (которая имеетпуть к этому файлу).Итак, у меня есть:

//HistoryForm
class HistoryForm extends BaseHistoryForm
{
  public function configure()
  {
      unset($this['text']);

      $this->setWidget('text', new sfWidgetFormTextareaTinyMCE(array(
          'width'  => 550,
          'height' => 350,
          'config' => 'theme_advanced_disable: "anchor,image,cleanup,help"',)));
      $this->setValidator('text', new sfValidatorString());

      $this->embedForm('uploadfile1', new UploadFileForm());
  }
}

//UploadFileForm
class UploadFileForm extends sfForm{
    public function configure() {
        $this->setWidget('file', new sfWidgetFormInputFile());
        $this->setValidator('file', new sfValidatorFile(array(
            'required' => false,
            'path' => sfConfig::get('sf_upload_dir')
        )));

        $this->setWidget('name', new sfWidgetFormInputText());
        $this->setValidator('name', new sfValidatorString(array('required' => true)));

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

    public function save({data_to_be_saved}){
         //logic of saving
    }
}

Основная проблема заключается в том, что внедрение формы доктрины работает отлично, но если я хочу сохранить форму, отличную от доктрины, метод сохранения никогда не вызывается (кажется, что не все sfForms должныбыть сохраненным), но если я переопределю saveEmbeddedForms , то встроенный sfForm не будет привязан!Прочитав код Symfony, выяснилось, что при внедрении формы добавление полей к основному widgetSchema приводит к тому, что использование формы для вставки практически бесполезно ... Итак, я делаю метод save вsfForm, которая выполняет сохранение, получая все необходимые переменные из параметров.Это вызов сделан в переопределенном методе save основной формы доктрины:

//HistoryForm
    class HistoryForm extends BaseHistoryForm
    {
     ...
     public function save($con = null) {
      $hc = parent::save($con);

      foreach ($this->getEmbeddedForms() as $form) {
          $values = $this->getValue($form->getName());
          $form->save($hc, $values);
      }
  }

Я провел весь день, размышляя и читая основной код Symfony, и не нашел подходящего подхода.Итак ... кто-нибудь знает (или думает) лучший подход?

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Общепринятый подход к выполнению того, что я думаю , который вы пытаетесь сделать, - это не использовать встроенную форму.Смешивать формы доктрин и sfForms, мягко говоря, хлопотно.

Я предполагаю, что вы пытаетесь связать запись базы данных с файлом?

Если это так, обычно это можно сделатьэто создать поле filename на HistoryForm.сделайте это поле виджетом sfWidgetInputFile.Этот виджет сохранит в файловую систему, а затем перезапишет метод сохранения форм для сохранения поля имени файла filename вместо содержимого файла.

Затем добавьте средство доступа к модели или класс помощника ресурса.получить связанный файл записи в файловой системе

0 голосов
/ 15 марта 2011

Вы пробовали этот плагин? У меня были проблемы с встраиванием отношений, но после этого все они были решены.

...