2009-06-22 7 views
5

Temelde aşağıdakileri yapmak için doSave() yöntemimi geçersiz kılıyorum: Kullanıcının seçim yapabileceği ya da yeni bir seçenek yazabileceği bir sfWidgetFormPropelChoice alanı var. Widget'ın değerini nasıl değiştirebilirim? Ya da belki de yanlış yöne yaklaşıyorum.Symfony'de, form alanının değeri nasıl ayarlanır?

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); 
} 

cevap

9

setDefault veya setDefaults kullanmalı ve daha sonra bağlı değerler ile otomatik olarak yerleşecektir. Yanıtınız için

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

kullanım

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

Sen eylem yapabileceğini: Yani burada ben DoSave() yöntemini overrode nasıl

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

Ama doğrudan üreticiye yapıyoruz işin türüne yapmayı tercih eşimdeki iş mantığım her zaman aynı yerde.

Formlarıma koyduğum şey çoğunlukla doğrulama mantığıdır. Burada

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

teşekkürler! Bu işi akranda yapmaktan nasıl vazgeçersiniz? Form ile ilgili olduğundan, formda gitmemeli mi? Akran, kimliği veya yeni bir isim olacak form verisine sahip değildir. –

1

İki varsayım: a) formu üreticisinin adını alır ve b) modeli üreticisi

kimliğini istediği Peer tasarruf yönteminde koymak için ne

Örnek

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); 
}