如何检测节点从“已发布”更改为“未发布”的时间?


17

hook_node_update()中,我可以很容易地告诉节点更新后的状态(无论是否发布)。

但是,是否有一种简单的方法可以检查更新的节点是否发布,但是现在还没有发布?(或相反亦然)?

我认为“规则”可能具有“节点值已更改”的某些条件或类似的条件,但我想以编程方式进行此操作。

我在drupal.org上的fago(规则开发人员)那里发现了这个问题,该问题似乎在Drupal 7中得到了解决,但是请给我一个很好的解释。

Answers:


31

没关系。仔细阅读以上链接的问题(尤其是评论#38)后,我发现$ node对象(实际上是任何实体)将“原始”缓存的副本存储在$ entity-> original中。

因此,我想检测一个节点是否从“状态= 1”更改为“状态= 0”(在未发布节点时会发生这种情况),下面的代码可以做到这一点:

<?php
function custom_node_update($node) {
  if ($node->type == 'article') {
    // Act on the unpublishing of an article.
    if ($node->original->status == 1 && $node->status == 0) {
      // Do something here.
    }
    // Act on the publishing of an article.
    if ($node->original->status == 0 && $node->status == 1) {
      // Do something here.
    }
  }
}
?>

3
我必须停止回答自己的问题;-)
geerlingguy 2011年

5
为什么?它仍然对我有帮助,值得+1 ;-)
uwe

嘿,这是我第十次在Google搜索结果中找到自己的答案。未来我,感谢过去我的回答:)
geerlingguy

如果你正在使用revisioning模块上面的代码是行不通的
穆罕默德·安瓦尔

根据记录,这不可能不工作的状态+流程+翻译,我不得不使用$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
十几岁的

1

node_save() 包含以下代码。

  try {
    // Load the stored entity, if any.
    if (!empty($node->nid) && !isset($node->original)) {
      $node->original = entity_load_unchanged('node', $node->nid);
    }
  }

entity_load_unchanged()从数据库加载实体(在本例中为节点);它会在正在运行的模块进行任何更改之前返回实体对象。

该代码在任何预保存和更新挂钩之前执行。

module_invoke_all('node_presave', $node);
module_invoke_all('entity_presave', $node, 'node');

//... 

node_invoke($node, $op);

// Save fields.
$function = "field_attach_$op";
$function('node', $node);

module_invoke_all('node_' . $op, $node);
module_invoke_all('entity_' . $op, $node, 'node');

在这些挂钩中,可以进行任何更改之前查看节点属性$node->original,例如使用$node->original->status

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.