2009-06-22 13 views
5

Nadpisuję moją metodę doSave(), aby wykonać następujące czynności: Mam pole sfWidgetFormPropelChoice, które użytkownik może wybrać albo wpisać nową opcję. Jak mogę zmienić wartość widgetu? A może podchodzę do tego w niewłaściwy sposób. Więc tutaj jest jak ja overrode() metoda doSave:W symfony, jak ustawić wartość pola formularza?

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

Odpowiedz

9

Należy użyć komendy setDefault lub setDefaults, a następnie zostaną one automatycznie wypełnione powiązanymi wartościami.

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

Wykorzystanie

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

Można to zrobić w akcji:

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

Ale wolę zrobić ten rodzaj pracy robisz z producentem bezpośrednio w moim Peer, więc moja logika biznesowa jest zawsze w tym samym miejscu.

To, co umieszczam w moich formularzach, to głównie logika walidacji.

Przykład co umieścić w metodzie ratowania z Peer:

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

Dzięki za odpowiedź! Jak poradziłbyś sobie z robieniem tej pracy w grupie? Skoro jest to związane z formą, czy nie powinno być w formie? Element równorzędny nie ma danych formularza, które mogłyby być identyfikatorem lub nową nazwą. –

1

Dwa założenie tu: a) Formularz Pobiera nazwę producenta oraz b) model chce identyfikator producenta

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); 
} 
Powiązane problemy