symfony是否有内置的方法来比较污染值和原始值?

时间:2011-04-12 16:35:47

标签: forms symfony1 doctrine

我正在使用带有Doctrine的symfony 1.4。我已经构建了一个表单,该表单使用具有Versionable行为的表。正如所料,每次提交和保存表单时,Versionable都会创建该行的新版本。我的问题是,如果提交的实际值与通过编辑操作放入表单的原始值没有任何不同,我想阻止它这样做。

我知道我可以通过javascript相对容易地做到这一点。我只是好奇symfony或Doctrine是否已经具有此功能,以及如何使用它。它似乎就像symfony有一个方法,可以在调用$form->save()之前检查。我是在梦想还是遗漏了一些明显的东西?

3 个答案:

答案 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()