从“maquina”和“emisor”之间的关系中获取并设置当前值

时间:2013-06-25 22:29:01

标签: symfony1 symfony-1.4

this topicthis other topic相关我正在试验一个问题。这是SdrivingMaquinForm.class.php代码:

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值得到正确保存,如果我再次编辑现有记录值正确保存,并且如果我删除记录,则关系也会被删除。所以问题不在于行动或方法。我遇到的问题是当用户选择编辑现有记录时。字段idempresapatente(请参阅此处提到的第一篇帖子中的schema.yml)获取他们的值,但no_emisor不是这样,每次我想编辑记录时,我都选择了值,是,但所选值不正确,因为我得到add_empty值。我怎么解决这个问题?这意味着我如何基于maquinaemisor之间关系存在的选择来为选择分配默认值?

编辑:制定可能的解决方案

我正在尝试这段代码:

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()方法吗?

编辑: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 个答案:

答案 0 :(得分:1)

在这些情况下,你总是要做两件事:

  • 将doctrine记录对象的默认值加载到表单小部件
  • 使用发布值
  • 更新doctrine对象

大多数情况下,您应该对称使用updateDefaultsFromObjectdoUpdateObject

要加载保存的值,请覆盖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']);
  }
}