2009-06-22 67 views
5

我重寫我的doSave()方法基本上做到以下幾點:我有一個sfWidgetFormPropelChoice字段,用戶可以選擇,或鍵入一個新的選項。我怎樣才能改變小部件的價值?或者,也許我正在接近這個錯誤的方式。因此,這裏是我如何推翻了DoSave就會()方法:在symfony中,如何設置表單域的值?

public function doSave($con = null) 
{ 
    // Save the manufacturer as either new or existing. 
    $manufacturer_obj = ManufacturerPeer::retrieveByName($this['manufacturer_id']->getValue()); 
    if (!empty($manufacturer_obj)) 
    { 
     $this->getObject()->setManufacturerId($manufacturer_obj->getId()); // NEED TO CHANGE THIS TO UPDATE WIDGET'S VALUE INSTEAD? 
    } 
    else 
    { 
     $new = new Manufacturer(); 
     $new->setName($this['manufacturer_id']->getValue()); 
     $new->save(); 
     $this->getObject()->setManufacturerId($new->getId()); // NEED TO CHANGE THIS TO UPDATE WIDGET'S VALUE INSTEAD? 
    } 

    parent::doSave($con); 
} 

回答

9

您應該使用setDefault或setDefaults,然後它會使用綁定值自動填充。

(sfForm) setDefault ($name, $default) 
(sfForm) setDefaults ($defaults) 

使用

$form->setDefault('WidgetName', 'Value'); 
$form->setDefaults(array(
    'WidgetName' => 'Value', 
)); 
2

你可以在動作做到這一點:

$this->form->getObject()->setFooId($this->foo->getId()) /*Or get the manufacturer id or name from request here */ 
$this->form->save(); 

但我喜歡做那種工作的您與您的製造商直接做在我的同行中,所以我的業務邏輯總是在同一個地方。

我在表單中放置的主要是驗證邏輯。

public function save(PropelPDO $con= null) 
{ 
    if ($this->isNew() && !$this->getFooId()) 
    { 
    $foo= new Foo(); 
    $foo->setBar('bar'); 
    $this->setFoo($foo); 
    } 
} 
+0

感謝您的答覆!你會如何去做同行中的這項工作?既然它與形式有關,不應該以形式出現嗎?對等體沒有可以是ID或新名稱的表單數據。 – 2009-06-23 04:51:15

1

兩個假設這裏::1)你的形式得到製造商的名稱和b)模型希望製造商

的ID

的放什麼在同行的保存方法示例

public function doSave($con = null) 
{ 
    // retrieve the object from the DB or create it 
    $manufacturerName = $this->values['manufacturer_id']; 
    $manufacturer = ManufacturerPeer::retrieveByName($manufacturerName); 
    if(!$manufacturer instanceof Manufacturer) 
    { 
     $manufacturer = new Manufacturer(); 
     $manufacturer->setName($manufacturerName); 
     $manufacturer->save(); 
    } 

    // overwrite the field value and let the form do the real work 
    $this->values['manufacturer_id'] = $manufacturer->getId(); 

    parent::doSave($con); 
} 
相關問題