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


17

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 programmazione.

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

Risposte:


31

Non importa. Dopo aver letto il problema sopra riportato (in particolare il 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 accade 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.
    }
  }
}
?>

3
Devo smettere di rispondere alle mie stesse domande ;-)
geerlingguy,

5
perché? Era ancora utile per me, vale la pena di uno ;-)
Uwe

Heh, questa è la decima volta che approdo la mia risposta nei risultati di Google. Futuro me grazie oltre me per aver risposto :)
geerlingguy

Il codice sopra riportato non funzionerà se si utilizza il modulo di revisione
Mohammad Anwar,

Per la cronaca, questo potrebbe non funzionare per status + flusso di lavoro + traduzione, che ho dovuto usare$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Adolescente

1

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 $node->original, ad esempio con $node->original->status.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.