2011-03-10 44 views
3

我正在制作一个表单,其中包含一些文本和上传文件。问题在于该文件没有保存在数据库(blob字段)中,因为客户端不想这样做,所以我制作了一个UploadFileForm来清理它,并执行上载和保存到文件表(它具有该文件的路径)。所以,我有:保存一个嵌入sfForm

//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 
    } 
} 

的主要问题是,embeding学说的形式完美地工作,但如果我想保存非学说形成保存方法不会被调用(似乎很好,因为不是所有的sfForms都被保存)但如果​​我覆盖saveEmbeddedForms嵌入sfForm不绑定!阅读symfony的代码发现,当嵌入一个表单真正做的是将这些字段附加到主要的widgetSchema,所以使用嵌入表单实际上是毫无用处的...所以,我所做的是在sfForm中制作一个保存方法,通过从参数中获取所有需要的变量进行保存。这就是呼叫在overrided方法制作保存主主义形式的

//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的核心代码,并没有找到适当的解决办法。所以......有人知道(或认为)更好的方法吗?

回答

1

通常被接受的做法我认为你试图做的是事实上不使用嵌入式表单。混合学说形式和sfForms至少是很麻烦的。

我假设你试图将数据库记录与文件关联?

如果是这样,通常的方式做,这是对HistoryForm创建filename场。使该字段成为sfWidgetInputFile小部件。该小部件将保存到文件系统,然后覆盖窗体的“保存”方法以保存文件名filename而不是文件内容。

然后在模型或资产的辅助类添加一个访问,以获得记录的相关文件的文件系统上

+0

是的,我试图用相关文件的路径保存记录。主要思想是动态嵌入UploadFileForm的,因此用户可以上传多个文件。你说的是正确的,但无法弄清楚如何使用多个文件来应用你的答案。 – Pabloks 2011-03-15 12:39:33

+1

关于如何做到这一点,symfony文档中有一个例子。 http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms – xzyfer 2011-03-15 21:05:07

+0

我见过,但在这种情况下,fileForm的扩展doctrineForm和完美的作品(因为它使用的原则保存方法)。我正在寻找(或询问)一种很好的方式来混合doctrineForm和sfForm,并为sfForm创建一个保存方法。我认为,鉴于我的搜索,没有简单的方法。 – Pabloks 2011-03-16 03:39:59

0

你试过this插件吗?我在嵌入关系方面遇到了问题,但在尝试完成后,所有这些问题都得到了解决。

+0

我会看到它,似乎不错!但在这种情况下的问题是,我混合主义形式与sfForm。 – Pabloks 2011-03-15 12:41:14