sfWidgetFormSelect提供了一个字符串或一个int的选定的项目?

问题描述:

我有一个恼人的问题。我试图找出表单的哪些字段已更改,然后将其插入表中。我设法在以下sfWidgetFormSelect提供了一个字符串或一个int的选定的项目?

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

显示doUpdateObjectas到的var_dump而现在似乎$这个 - >的getObject() - > getModified似乎之前和将其设置为true或false值之后,给我的工作。

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

下面是两个变种转储结果显示:

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“}

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

而且我该如何将更改插入到另一个数据库表中?让我们说我的日志表?

任何想法和建议,为什么这是发生的赞赏,我一直在试图弄清楚和浏览谷歌的各种关键字没有用。

谢谢!

编辑:

行,所以我创造了另一个领域,整数我的架构只是用于测试。 我创建了一个条目,将其保存并编辑。

这次发生了同样的事情!

好吧, 事实证明,我忘了做一个自定义验证器来使用数组键。

第一,如果你什么STATUS_ID被保存在数据库中,你应该定义你的状态数组是这样的:

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

这样的方式,他知道,1应该像“一”等渲染。然后,保存时只应保存索引。

关于保存在另一个数据库中,我的建议是修改由Form类定义的doSave方法,以符合您的需求。我只知道如何行走处理它,也许这可以帮助:

的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方法的n,Symfony1.4上的当前sfFomrObject,以及何时以及如何委托处理修改后的值的对象。

+0

嘿!添加1 =>“a”等可能只是工作!为什么没有发生在我身上。 D'哦!噢,也许我应该在doSave下做,而不是doUpdateObject。为此非常感谢!当我回到家时,我会尝试它,但现在,它仍然是一个投票。 – han 2010-12-20 03:01:01

+0

嘿韩希望能为你解决问题,我会期待你的结果!我非常乐意帮助! – guiman 2010-12-20 03:03:17

+0

嘿,不幸的是,它不工作:(我尝试检测doSave下的变化,但他们变成空白。我也试过阵列的东西。它仍然是一样的:( – han 2010-12-20 13:52:40