我正在制作一个表单,其中包含一些文本和上传文件。问题在于该文件没有保存在数据库(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的核心代码,并没有找到适当的解决办法。所以......有人知道(或认为)更好的方法吗?
是的,我试图用相关文件的路径保存记录。主要思想是动态嵌入UploadFileForm的,因此用户可以上传多个文件。你说的是正确的,但无法弄清楚如何使用多个文件来应用你的答案。 – Pabloks 2011-03-15 12:39:33
关于如何做到这一点,symfony文档中有一个例子。 http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms – xzyfer 2011-03-15 21:05:07
我见过,但在这种情况下,fileForm的扩展doctrineForm和完美的作品(因为它使用的原则保存方法)。我正在寻找(或询问)一种很好的方式来混合doctrineForm和sfForm,并为sfForm创建一个保存方法。我认为,鉴于我的搜索,没有简单的方法。 – Pabloks 2011-03-16 03:39:59