2013-06-25 2 views
0

Связано с this topic и this other topic Я экспериментирую с проблемой. Это SdrivingMaquinForm.class.php код:Получить и установить текущее значение из отношения между «maquina» и «emisor»

class SdrivingMaquinaForm extends BaseSdrivingMaquinaForm { 

    protected $current_user; 

    public function configure() { 
     $this->current_user = sfContext::getInstance()->getUser()->getGuardUser(); 

     unset($this['updated_at'], $this['created_at']); 

     $this->widgetSchema['idempresa'] = new sfWidgetFormInputHidden(); 
     $id_empresa = $this->current_user->getSfGuardUserProfile()->getIdempresa(); 
     $this->setDefault('idempresa', $id_empresa); 

     $this->widgetSchema['no_emisor'] = new sfWidgetFormDoctrineChoice(array('model' => 'SdrivingEmisor', 'add_empty' => 'Seleccione un Emisor', 'table_method' => 'fillChoice')); 
     $this->validatorSchema['idempresa'] = new sfValidatorPass(); 
     $this->validatorSchema['no_emisor'] = new sfValidatorPass(); 
    } 

    protected function doUpdateObject($values) { 
     parent::doUpdateObject($values); 

     if (isset($this['no_emisor'])) { 
      if ($this->isNew()) { 
       $sdrivingMaquinaEmisor = new SdrivingMaquinaEmisor(); 
       $this->getObject()->setSdrivingMaquinaEmisor($sdrivingMaquinaEmisor); 
      } else { 
       $sdrivingMaquinaEmisor = $this->getObject()->getSdrivingMaquinaEmisor(); 
      } 

      $sdrivingMaquinaEmisor->setIdemisor($this->values['no_emisor']); 
     } 
    } 

} 

И это отлично работает, если я создаю новый maquina значения сохраняются правильно, если я отредактировать существующую запись еще раз значения сохраняются правильно, и если я удалить запись, то соотношение также удаляется. Таким образом, проблема заключается не в действиях и методах. Проблема, с которой я сталкиваюсь, - это когда пользователь выбирает существующая запись. Поле idempresa и patente (см. Schema.yml в первом сообщении, см. Здесь) получает свои значения, но no_emisor не так каждый раз, когда я хочу редактировать запись, я получил выбор со значениями, да, но выбранное значение не является правильно, потому что я получаю значение add_empty. Как я это исправим? Значение, как я назначаю значение по умолчанию для выбора на основе существующего по отношению между maquina и emisor?

EDIT: работа на возможное решение

Я пытаюсь этот код:

public function executeEdit(sfWebRequest $request) { 
     $this->forward404Unless($sdriving_maquina = Doctrine_Core::getTable('SdrivingMaquina')->find(array($request->getParameter('idmaquina'))), sprintf('Object sdriving_maquina does not exist (%s).', $request->getParameter('idmaquina'))); 
     $this->forward404Unless($sdriving_maquina_emisor = Doctrine_Core::getTable('SdrivingMaquinaEmisor')->find(array($request->getParameter('idmaquina'))), sprintf('Object sdriving_maquina_emisor does not exist (%s).', $request->getParameter('idmaquina'))); 

     $this->form = new SdrivingMaquinaForm($sdriving_maquina, $sdriving_maquina_emisor); 
    } 

Но тогда как в виде configure() метод, который я могу получить доступ к $sdriving_maquina_emisor для того, чтобы использовать форму setDefault() метод?

EDIT: doUpdateObject($values)

Смотрите это как моя doUpdateObject($values) функция выглядит следующим образом:

protected function doUpdateObject($values) { 
    parent::doUpdateObject($values); 

    if (isset($this['no_emisor'])) { 
     if ($this->isNew()) { 
      $sdrivingMaquinaEmisor = new SdrivingMaquinaEmisor(); 
      $this->getObject()->setSdrivingMaquinaEmisor($sdrivingMaquinaEmisor); 
     } else { 
      $sdrivingMaquinaEmisor = $this->getObject()->getSdrivingMaquinaEmisor(); 
     } 

     $sdrivingMaquinaEmisor->setIdemisor($this->values['no_emisor']); 
    } 
} 

Где именно ноги код, который вы оставить для doUpdateObject()?

ответ

1

В этих ситуациях вы всегда должны сделать 2 вещи:

  • нагрузки значения по умолчанию из объекта доктрины записи в виде виджет
  • обновления объекта доктрины с публикуемым значением

И большую часть времени вы должны использовать updateDefaultsFromObject и doUpdateObject симметрично.

Чтобы загрузить обратно сохраненные значения переопределяют updateDefaultsFromObject:

// maybe you have to declare it as public if the parent class requires that 
protected function updateDefaultsFromObject() 
{ 
    parent::updateDefaultsFromObject(); 

    if (isset($this['no_emisor']) 
    { 
    $this->setDefault('no_emisor', $this->getObject()->getSdrivingMaquinaEmisor()->getIdemisor()); 
    } 
} 

// and you can simplify this a little bit as well 
protected function doUpdateObject($values) 
{ 
    parent::doUpdateObject($values); 

    if (isset($this['no_emisor'])) 
    { 
    $this->getObject()->getSdrivingMaquinaEmisor()->setIdemisor($this->values['no_emisor']); 
    } 
} 
+0

вы можете посмотреть на моей последнюю правку в главном посте? Я заблудился в функции 'doUpdateObject ($ values)' и код, который вы оставите меня здесь, в вашем ответе – Reynier

+0

неважно, что я выясню, и он работает, большое спасибо и позвольте мне сказать, что ваши предложения очень помогают мне в течение последних дней не только в этом посте, спасибо – Reynier