sfWidgetFormSelect提供所选项的字符串或int吗?

时间:2010-12-19 15:33:37

标签: php doctrine symfony-forms symfony-1.4

我遇到了烦人的问题。我试图找出表单的哪些字段已更改,然后将其插入表中。我设法在下面的

中显示的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));

状态是包含{“”a“,”b“,”c“,”d“}等值的数组

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

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

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

谢谢!

编辑:

好的,所以我在我的架构中创建了另一个字段,仅用于测试。 我创建了一个条目,保存并编辑了它。

这次发生了同样的事情!

2 个答案:

答案 0 :(得分: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,以及它何时以及如何委托对象处理修改后的值

答案 1 :(得分:0)

好, 事实证明,我忘了使用自定义验证器来代替使用数组密钥。