web-dev-qa-db-fra.com

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

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.

16
geerlingguy

Ça ne fait rien. Après avoir lu le problème lié ci-dessus (en particulier commentaire # 38 ), j'ai trouvé que l'objet $ node (n'importe quelle entité, en fait) stocke la copie 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.
    }
  }
}
?>
31
geerlingguy

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) depuis 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 dans $node->original, Par exemple avec $node->original->status.

1
kiamlaluno