我遇到了烦人的问题。我试图找出表单的哪些字段已更改,然后将其插入表中。我设法在下面的
中显示的doUpdateObject中的var_dumppublic 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“}等值的数组
我只想将状态索引存储在数据库中。
还有如何将更改插入另一个数据库表?让我们说我的日志表?
关于为什么会发生这种情况的任何想法和建议都值得赞赏,我一直试图弄明白并浏览谷歌搜索各种关键词但无济于事。
谢谢!
编辑:
好的,所以我在我的架构中创建了另一个字段,仅用于测试。 我创建了一个条目,保存并编辑了它。
这次发生了同样的事情!
答案 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)
好, 事实证明,我忘了使用自定义验证器来代替使用数组密钥。