¿Cómo puedo detectar cuando un nodo se cambia de 'Publicado' a 'No publicado'?

17

En hook_node_update () , puedo decir fácilmente el 'estado' de un nodo (ya sea publicado o no) después de que se haya actualizado.

Sin embargo, ¿hay una manera fácil de verificar si el nodo actualizado se publicó, pero ahora no? (O viceversa)?

Creo que las Reglas pueden tener alguna condición para 'el valor del nodo ha cambiado' o algo por el estilo, pero me gustaría hacerlo programáticamente.

Encontré este problema por fago (desarrollador de Reglas) en drupal.org que parece tratar con esto en Drupal 7, pero agradecería una buena explicación.

geerlingguy
fuente

Respuestas:

31

No importa. Después de leer el problema vinculado anteriormente (especialmente el comentario # 38 ), descubrí que el objeto $ node (cualquier entidad, en realidad) almacena la copia en caché 'original' en $ entity-> original.

Entonces, quería detectar si un nodo cambió de 'estado = 1' a 'estado = 0' (esto sucede cuando el nodo no está publicado), y el siguiente código hace esto:

<?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
fuente
3
Tengo que dejar de responder mis propias preguntas ;-)
geerlingguy
55
¿por qué? Todavía fue útil para mí, valió un +1 ;-)
uwe
Je, esta es la décima vez que obtengo mi propia respuesta en los resultados de Google. Futuro yo gracias pasado por responder :)
geerlingguy
El código anterior no funcionará si está utilizando un módulo de revisión
Mohammad Anwar
Para el registro, esto podría no estar funcionando para el estado + flujo de trabajo + traducción, tuve que usar$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teenage
1

node_save() contiene el siguiente código.

  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()carga la entidad (en este caso, el nodo) de la base de datos; devuelve el objeto de entidad antes de cualquier cambio realizado desde los módulos en ejecución.

El código se ejecuta antes de cualquier guardado previo y actualiza los ganchos.

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

En esos ganchos, es posible ver las propiedades del nodo antes de cualquier cambio $node->original, por ejemplo con $node->original->status.

kiamlaluno
fuente