保存嵌入sfForm

时间:2011-03-10 02:58:56

标签: php symfony1 symfony-1.4

我正在制作一个包含一些文字和上传文件的表格。问题是该文件没有保存在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
    }
}

主要的问题是嵌入一个教义形式是完美的,但如果我想保存一个非教义形式,则永远不会调用save方法(看起来很好,因为不是所有的sfForms都必须保存)但是如果我重写 saveEmbeddedForms embed sfForm没有绑定!阅读symfony的代码发现,在嵌入表单时,实际上将字段附加到主widgetSchema,因此使用嵌入表单实际上是无用的......所以,我所做的是制作 save 方法在sfForm中,通过从参数中获取所有需要的变量来进行保存。这是在主要学说形式的覆盖方法保存中进行的调用:

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

答案 0 :(得分:1)

执行我认为您正在尝试做的事情的普遍接受的方法是实际上不使用嵌入的表单。至少可以说,混合学说形式和sfForms是很麻烦的。

我假设您正在尝试将数据库记录与文件相关联?

如果是这样,通常的方法是在filename上创建HistoryForm字段。将此字段设为sfWidgetInputFile小部件。此小部件将保存到文件系统,然后覆盖表单的“保存”方法以保存文件的名称filename字段而不是文件内容。

然后在模型或资产助手类上添加访问器以获取文件系统上记录的关联文件

答案 1 :(得分:0)

您是否尝试过this插件?我在嵌入关系方面遇到了问题,但在尝试完之后,所有问题都解决了。