В Symfony, как установить значение поля формы?

Asked
Viewd28310

5

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

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

3 ответов

9

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

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

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

 $form->setDefault('WidgetName', 'Value');
$form->setDefaults(array(
    'WidgetName' => 'Value',
));
 
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);
}
 
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);
   } 
}
 
  • Спасибо за ответ! Как бы вы проделали эту работу с коллегой? Поскольку это связано с формой, разве это не должно идти в форме? У однорангового узла нет данных формы, которые были бы идентификатором или новым именем.

    James Skidmore23 июня 2009, 04:51