2009-06-22 7 views
5

Je substitue ma méthode doSave() pour essentiellement faire ce qui suit: J'ai un champ sfWidgetFormPropelChoice que l'utilisateur peut choisir, ou tapez une nouvelle option. Comment puis-je changer la valeur du widget? Ou peut-être que j'approche cela de la mauvaise façon. Alors, est ici comment je l'emporterait sur la méthode doSave():Dans symfony, comment définir la valeur d'un champ de formulaire?

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

Répondre

9

Vous devez utiliser setDefault ou setDefaults, puis il va s'autopopuler avec les valeurs liées.

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

utilisation

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

Vous pouvez le faire dans l'action:

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

Mais je préfère faire le genre de travail que vous faites avec votre fabricant directement dans mon pair, ma logique d'entreprise est toujours au même endroit.

Ce que je mets dans mes formulaires est principalement la logique de validation.

Exemple de quoi mettre dans la méthode de sauvegarde du Peer:

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

Merci pour votre réponse! Comment iriez-vous faire ce travail chez les pairs? Puisque c'est lié à la forme, ne devrait-il pas aller dans le formulaire? L'homologue n'a pas les données de formulaire qui seraient un ID ou un nouveau nom. –

1

Deux hypothèse ici: a) votre formulaire obtient le nom du fabricant et b) votre modèle veut l'ID d'un fabricant

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