Comment puis-je détecter lorsqu'un nœud passe de «Publié» à «Non publié»?

17

Dans hook_node_update () , je peux facilement dire le «statut» d'un nœud (qu'il soit publié ou non) après sa mise à jour.

Cependant, existe-t-il un moyen facile de vérifier si le nœud mis à jour a été publié, mais ne l'est pas maintenant? (Ou vice versa)?

Je pense que les règles peuvent avoir une condition pour «la valeur du nœud a changé» ou quelque chose dans ce sens, mais je voudrais le faire par programme.

J'ai trouvé ce problème par fago (développeur de Rules) sur drupal.org qui semble traiter cela dans Drupal 7, mais une belle explication serait appréciée.

geerlingguy
la source

Réponses:

31

Ça ne fait rien. Après avoir lu le problème lié ci-dessus (en particulier le commentaire # 38 ), j'ai trouvé que l'objet $ node (n'importe quelle entité, en fait) stocke la copie mise en cache 'originale' dans $ entity-> original.

Donc, je voulais détecter si un nœud était passé de 'status = 1' à 'status = 0' (cela se produit lorsque le nœud n'est pas publié), et le code suivant le fait:

<?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.
    }
  }
}
?>
geerlingguy
la source
3
Je dois arrêter de répondre à mes propres questions ;-)
geerlingguy
5
Pourquoi? Cela m'a toujours été utile, vaut un +1 ;-)
uwe
Hé, c'est à peu près la 10e fois que je décroche ma propre réponse dans les résultats de Google. Futur moi merci après moi d'avoir répondu :)
geerlingguy
Le code ci-dessus ne fonctionnera pas si vous utilisez un module de révision
Mohammad Anwar
Pour mémoire, cela ne pouvait pas ne pas fonctionner pour status + workflow + translation, j'ai dû utiliser$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teenage
1

node_save() contient le code suivant.

  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()charge l'entité (dans ce cas le nœud) à partir de la base de données; il renvoie l'objet entité avant toute modification effectuée à partir des modules en cours d'exécution.

Le code est exécuté avant toute pré-sauvegarde et mise à jour des hooks.

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');

Dans ces hooks, il est possible de voir les propriétés du nœud avant toute modification $node->original, par exemple avec $node->original->status.

kiamlaluno
la source