Drupal 7 带有Filefield的触发器规则';当字段已更改时';在Drupal 7中

Drupal 7 带有Filefield的触发器规则';当字段已更改时';在Drupal 7中,drupal-7,rules,filefield,Drupal 7,Rules,Filefield,我有一套不同的规则来检查“在更新现有内容之后”是否更新了各种字段类型。问题是,除了唯一不起作用的文件字段类型之外,每种类型都可以正常工作。使用的条件是字段上的“非数据比较”,检查“节点未更改”版本与新的“节点”版本。这适用于所有其他类型的字段和操作(我至少使用过),而不是filefield类型;无论文件字段是否发生更改,规则都会触发 我还发现了一个非常类似的问题: 我想我已经具备了解决问题的能力,但我只是想先和一些其他开发人员核实一下,因为我的PHP不是最好的 如果我要启用PHP模块,那么在规则

我有一套不同的规则来检查“在更新现有内容之后”是否更新了各种字段类型。问题是,除了唯一不起作用的文件字段类型之外,每种类型都可以正常工作。使用的条件是字段上的“非数据比较”,检查“节点未更改”版本与新的“节点”版本。这适用于所有其他类型的字段和操作(我至少使用过),而不是filefield类型;无论文件字段是否发生更改,规则都会触发

我还发现了一个非常类似的问题:

我想我已经具备了解决问题的能力,但我只是想先和一些其他开发人员核实一下,因为我的PHP不是最好的

如果我要启用PHP模块,那么在规则中添加一个条件,检查“source”属性以查看是否添加了新文件。。。这样行吗?我的密码是:

if (isset($object->field_FILEFIELD_NAME[0]['source'])) { //Check for new files }
我相信$object是规则函数作为参数传递的节点


这是一个好主意/最佳方法吗?任何想法或解决方法都会很好。

是的,您可以使用PHP进行文件字段检查,因为它更清晰(但总是不太安全)。以下是我的建议:

  • 创建规则组件(类型为“条件集(AND)”),而不是执行此检查的规则
  • 在规则组件(节点类型)中使用参数,这样就可以使用$Node
  • 使用php进行检查。使用$node从文件字段获取文件数据
  • 创建一个普通规则(例如在保存内容之前使用event),将此组件用作其他条件
  • 正如您所说,您需要检查差异,而不是空值,对吗?因此,您不需要使用
    isset
    ,而是需要查看是否存在不同的fid(当存在不同的文件时,fid通常会发生变化)。其他方法也可用,如果您想查看哪些数据可以更改,请使用devel模块对文件字段执行
    dpm()


    为了获得文件字段的未更改的值,请在主规则上使用相同的组件,但使用$unchanged节点作为参数。

    多亏了DOROS,我将尝试一下!