2009-06-22 2 views
5

Я переопределяю свой метод doSave(), чтобы в основном сделать следующее: у меня есть поле sfWidgetFormPropelChoice, которое пользователь может выбрать, или введите новый параметр. Как изменить значение виджета? Или, может быть, я приближаюсь к этому неправильно. Так вот, как я отменяю метод doSave():В symfony, как установить значение поля формы?

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

ответ

9

Вы должны использовать setDefault или setDefaults, а затем он будет автопопулен с привязанными значениями.

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

использование

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

Вы могли бы сделать это в действии:

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

Но я предпочитаю делать вид работы, которую вы делаете с производителем напрямую в моем Peer, поэтому моя бизнес-логика всегда находится на одном и том же месте.

То, что я положил в своих формах, в основном является логикой проверки.

Пример того, что поставить в методе сохранения одноранговых:

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

Спасибо за ваш ответ! Как вы собираетесь заниматься этой работой в коллеге? Поскольку это связано с формами, разве это не должно быть в форме? У однорангового узла нет данных формы, которые были бы либо идентификатором, либо новым именем. –

1

Два предположения здесь: а) ваша форма получает имя производителя и б) ваша модель хочет идентификатор производителя

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); 
} 
Смежные вопросы