2009-06-22 14 views
5

Sto sovrascrivendo il mio metodo doSave() per fare fondamentalmente quanto segue: Ho un campo sfWidgetFormPropelChoice da cui l'utente può scegliere, o digitare una nuova opzione. Come posso modificare il valore del widget? O forse mi sto avvicinando a questo nel modo sbagliato. Quindi, ecco come ho calpestato il metodo doSave():In symfony, come impostare il valore di un campo modulo?

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

risposta

9

È necessario utilizzare setDefault o setDefaults e quindi verrà eseguito l'autopopolamento con i valori associati.

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

utilizzo

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

si potesse fare nell'azione:

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

Ma io preferisco fare il tipo di lavoro che si sta facendo con il produttore direttamente nel mio peer quindi la mia logica di business è sempre nello stesso posto.

Quello che metto nei miei moduli è principalmente la logica di validazione.

Esempio di cosa mettere nel metodo save del peer:

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

Grazie per la risposta! Come faresti a fare quel lavoro nel peer? Dal momento che è legato alla forma, non dovrebbe andare nella forma? Il peer non ha i dati del modulo che potrebbero essere un ID o un nuovo nome. –

1

due ipotesi qui: a) il modulo ottiene il nome del produttore e b) il vostro modello vuole l'ID di un produttore

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