在hook_node_update()中,我可以很容易地告诉节点更新后的状态(无论是否发布)。
但是,是否有一种简单的方法可以检查更新的节点是否已发布,但是现在还没有发布?(或相反亦然)?
我认为“规则”可能具有“节点值已更改”的某些条件或类似的条件,但我想以编程方式进行此操作。
我在drupal.org上的fago(规则开发人员)那里发现了这个问题,该问题似乎在Drupal 7中得到了解决,但是请给我一个很好的解释。
在hook_node_update()中,我可以很容易地告诉节点更新后的状态(无论是否发布)。
但是,是否有一种简单的方法可以检查更新的节点是否已发布,但是现在还没有发布?(或相反亦然)?
我认为“规则”可能具有“节点值已更改”的某些条件或类似的条件,但我想以编程方式进行此操作。
我在drupal.org上的fago(规则开发人员)那里发现了这个问题,该问题似乎在Drupal 7中得到了解决,但是请给我一个很好的解释。
Answers:
没关系。仔细阅读以上链接的问题(尤其是评论#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.
}
}
}
?>
$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 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
。