1

我有一个烦人的问题。我试图找出表单的哪些字段已更改,然后将其插入表中。我设法在 doUpdateObject 中进行了 var_dump,如下所示

public function doUpdateObject($values) 
{ 
    parent::doUpdateObject($values);
    var_dump($this->getObject()->getModified(false));
    var_dump($this->getObject()->getModified(true));
 } 

似乎 $this->getObject()->getModified 似乎可以通过将其设置为 true 或 false 来为我提供前后值。

我现在面临的问题是,在某种程度上,sfWidgetFormSelect 似乎将我的一个字段保存为字符串。在保存之前,完全相同的字段是一个 int。(我在之前和之后都通过 var_dump 得到了这个想法)。

以下是两个 var 转储的结果显示:

array(1) {["annoying_field"]=> int(3)} array(1) {["annoying_field"]=>string(1)"3"}

这似乎使教义认为这是一种修改,因此给出了误报。

在我的基本形式中,我有

under $this->getWidgets()
'annoying_field'    => new sfWidgetFormInputText(),

under $this->setValidators
'annoying_field'    => new sfValidatorInteger(array('required' => false)),

最后在我配置的 Form.class.php 中,我重新配置了文件:

$this->widgetSchema['annoying_field'] = new sfWidgetFormSelect(array('choices' => $statuses));

statuses 是一个包含 {""a", "b", "c", "d"} 等值的数组

我只想将状态索引存储在数据库中。

还有如何将更改插入另一个数据库表?假设我的日志表?

任何关于为什么会发生这种情况的想法和建议都值得赞赏,我一直在试图弄清楚并在谷歌上浏览各种关键字,但无济于事。

谢谢!

编辑:

好的,所以我在我的模式中创建了另一个字段,整数只是为了测试。我创建了一个条目,保存并编辑了它。

这次同样的事情发生了!

4

2 回答 2

1

首先,如果您将 status_id 保存在数据库中,您应该像这样定义您的状态数组:

 {1 => "a", 2 => "b", 3 => "c", 4 => "d"}

这样他就知道 1 应该呈现为“a”等等。然后,在保存时,只应保存索引。

关于保存在另一个数据库中,我的建议是修改 Form 类定义的 doSave 方法,以满足您的需要。我只知道 Propel 如何处理它,也许这会有所帮助:

doSave 方法的剂量如下:

  protected function doSave($con = null)
  {
    if (null === $con)
    {
      $con = $this->getConnection();
    }

    $old = $this->getObject()->getModifiedValues($this);//Define this
    $new_object = new Log($old);//Create a new log entry
    $new_object->save($con));//save it!

    $this->updateObject();

    $this->getObject()->save($con);

    // embedded forms
    $this->saveEmbeddedForms($con);
  }

希望这可以帮助!

编辑:

这是从我的一个应用程序中的模型中提取的一个示例,它工作正常:

架构:

[...]    
funding_source_id:
  type: integer
  required: true
[...]

形式:

$this->setWidget('funding_source_id', new sfWidgetFormChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
)));


$this->setValidator('funding_source_id', new sfValidatorChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
  'required' => true
)));

关于日志的事情,这可能更复杂,你应该阅读基表单类中 doSave 方法的当前实现,目前是 Symfony1.4 上的 sfFomrObject,以及它何时以及如何委托处理修改值的对象。

于 2010-12-20T02:56:52.607 回答
0

好的,原来我忘了做一个自定义验证器来使用数组键。

于 2010-12-24T00:48:03.453 回答