2009-06-22 8 views
5

Estoy anulando mi método doSave() para básicamente hacer lo siguiente: Tengo un campo sfWidgetFormPropelChoice que el usuario puede elegir o escribir una nueva opción. ¿Cómo puedo cambiar el valor del widget? O tal vez me estoy acercando a esto de la manera incorrecta. Así que aquí es lo que me hizo caso omiso del método doSave():En symfony, ¿cómo establecer el valor de un campo de formulario?

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

Respuesta

9

Debe usar setDefault o setDefaults y luego se autopoblará con los valores encuadernados.

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

uso

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

que podría hacerlo en la acción:

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

Pero prefiero hacer el tipo de trabajo que está haciendo con su fabricante directamente en mi Peer, entonces mi lógica de negocios siempre está en el mismo lugar.

Lo que pongo en mis formularios es principalmente la lógica de validación.

Ejemplo de qué poner en el método save de la Peer:

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

Gracias por su respuesta! ¿Cómo harías ese trabajo en el par? Dado que está relacionado con la forma, ¿no debería ir en la forma? El par no tiene los datos del formulario que serían una identificación o un nombre nuevo. –

1

Dos hipótesis aquí: a) el formulario obtiene el nombre del fabricante y b) el modelo que quiere el ID de un fabricante

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