2011-05-18 53 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