我正在使用带有Doctrine的symfony 1.4。我已经构建了一个表单,该表单使用具有Versionable行为的表。正如所料,每次提交和保存表单时,Versionable都会创建该行的新版本。我的问题是,如果提交的实际值与通过编辑操作放入表单的原始值没有任何不同,我想阻止它这样做。
我知道我可以通过javascript相对容易地做到这一点。我只是好奇symfony或Doctrine是否已经具有此功能,以及如何使用它。它似乎就像symfony有一个方法,可以在调用$form->save()
之前检查。我是在梦想还是遗漏了一些明显的东西?
答案 0 :(得分:1)
Doctrine_Record的save()
方法的注释是
/**
* applies the changes made to this object into database
* this method is smart enough to know if any changes are made
* and whether to use INSERT or UPDATE statement
*
* this method also saves the related components
*
* @param Doctrine_Connection $conn optional connection parameter
* @throws Exception if record is not valid and validation is active
* @return void
*/
首先,您应该检查它是否已经无效。
如果没有,Doctrine_Record有一个你可以使用的isModified()方法。如果表单对象的bind()
方法修改了首先应包含默认值的表单中的对象,则此方法应返回true。
答案 1 :(得分:1)
您可以使用DoctrineRecord::getModified()
函数返回已修改字段的数组以及来自被覆盖的save()
函数或侦听器(preSave
中的最佳值的猜测)的关联值。
如果新值没有任何不同,您可以绕过save()
的实际调用,因此不会创建新版本。
答案 2 :(得分:0)
如果你不想覆盖save()
方法或实现一个jaudette建议的监听器,你可以改为使用表单绑定:
$form->bind($values);
if ($form->isValid()) {
$form->updateObject();
$changes = $form->getObject()->getModified();
// save to database if desired
$form->save();
}
通过调用$form->updateObject()
不会将对象保存到数据库,但实际的php对象会被更改
另请注意,如果嵌入了子表单,则可能必须在每个相关对象上调用getModified()
。