2011-05-18 211 views
0

我有一个表单应该创建一个非常简单的新条目到数据库中。此表中的一个字段与另一个表相关。具体来说,有一个人参加的事件,我需要将人员分配给一个事件。每个事件可以有几个人参加,并且可以有几个事件。在symfony表单中将字段预加载到字段中,出现错误“无法更新表单字段”

当管理员用户将成员添加到事件中时,我不需要他们在实际表单上选择事件,这应该通过URL传递。例如

但是,我真的很困难如何将该ID包含在窗体中。如果我尝试手动设置字段值,则会收到错误Cannot Update Form Fields

 
    $this->['attendanceSuccess_id'] = 1; 

如果我试图隐藏字段:

  
$this->widgetSchema['attendanceSuccess_id'] = new sfWidgetFormInputHidden(); 

窗体显示,但显然没有传递值和我“要求字段错误”

这似乎是一个真正的简单而普通的事情,但我找不到任何解决方案!如何将URL值传递给字段指向另一个类的表单?

回答

0

这是我所做的。基本上你的表单持有一个隐藏的ID,并且你的动作从请求中获得并作为一个选项放入表单中。在表单中,您还可以将关系设置为Doctrine对象。

你的形式应该是这样(我不知道你的形式应当扩大究竟是什么,因为你使用的学说而我的是行走)

class SomethingForm extends BaseSomethingForm { 

public function __construct($object = null, $options = array(), $CSRFSecret = null) 
{ 
    parent::__construct($object, $options, $CSRFSecret); 
    if (isset($options['person_id'])) 
    { 
     $this->getObject()->setPersonId($options['person_id']); 
     $this->setDefault('person_id', $options['person_id']); 
    } 

} 
} 

public function configure() 
{ 
    $this->setWidget('person_id', new sfWidgetFormInputHidden()); 
...more stuff... 
} 

那么你的动作说:

$this->form = new SomethingForm(null, array(
'person_id' => $request->getParameter('person_id') 
)); 
+0

为什么你重写这个构造函数? – Dziamid 2011-05-18 16:38:21

+0

最初我是这么做的,因为它是一个必需的选项(比如person_id),如果它不在那里,我就抛出一个异常(但是我在粘贴时删除了那部分代码)。我的表单必须有该选项才能正常工作,所以我希望在构造函数中使用,以确保没有该选项时表单不能存在。在其他地方,我也用一个setter来完成它,我在'$ this-> form-> setPersonId($ request-> getParameter('person_id'))''中使用动作。你有偏好吗?无论哪种方式对我来说都不错,取决于选项的重要性以及代码的外观。 – matt 2011-05-18 17:08:38