it-swarm.it

Come posso rilevare quando un nodo viene modificato da "Pubblicato" a "Non pubblicato"?

In hook_node_update () , posso facilmente dire lo 'stato' di un nodo (che sia pubblicato o meno) dopo che è stato aggiornato.

Tuttavia, esiste un modo semplice per verificare se il nodo aggiornato è stato pubblicato , ma ora non lo è? (O vice versa)?

Penso che le Regole possano avere delle condizioni per "il valore del nodo è cambiato" o qualcosa del genere, ma mi piacerebbe farlo a livello di codice.

Ho trovato questo numero di fago (sviluppatore di regole) su drupal.org che sembra occuparsene in Drupal 7, ma una gradita spiegazione sarebbe apprezzata.

16
geerlingguy

Non importa. Dopo aver letto il problema sopra riportato (in particolare commento # 38 ), ho scoperto che l'oggetto $ node (qualsiasi entità, in realtà) memorizza la copia cache "originale" in $ entity-> originale.

Quindi, volevo rilevare se un nodo è cambiato da 'status = 1' a 'status = 0' (questo succede quando il nodo non è pubblicato), e il seguente codice fa questo:

<?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() contiene il seguente codice.

  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() carica l'entità (in questo caso il nodo) dal database; restituisce l'oggetto entità prima di qualsiasi modifica apportata dai moduli in esecuzione.

Il codice viene eseguito prima di qualsiasi pre-salvataggio e aggiorna gli hook.

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

In questi hook, è possibile vedere le proprietà del nodo prima di qualsiasi modifica in $node->original, Ad esempio con $node->original->status.

1
kiamlaluno