Como posso detectar quando um nó é alterado de 'Publicado' para 'Não publicado'?

17

Em hook_node_update () , posso dizer com facilidade o 'status' de um nó (publicado ou não) após a atualização.

No entanto, existe uma maneira fácil de verificar se o nó atualizado foi publicado, mas agora não é? (Ou vice-versa)?

Acho que as regras podem ter alguma condição para 'o valor do nó mudou' ou algo nesse sentido, mas eu gostaria de fazer isso programaticamente.

Encontrei esse problema pelo fago (desenvolvedor de Regras) no drupal.org que parece lidar com isso no Drupal 7, mas uma boa explicação seria apreciada.

geerlingguy
fonte

Respostas:

31

Deixa pra lá. Depois de ler o problema vinculado acima (especialmente o comentário nº 38 ), descobri que o objeto $ node (qualquer entidade, na verdade) armazena a cópia em cache 'original' em $ entity-> original.

Portanto, eu queria detectar se um nó mudou de 'status = 1' para 'status = 0' (isso acontece quando o nó não é publicado) e o seguinte código faz isso:

<?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
fonte
3
Eu tenho que parar de responder às minhas próprias perguntas ;-)
geerlingguy
5
porque? Ainda era útil para mim, vale a pena um ;-)
Uwe
Heh, é a décima vez que cheguei à minha própria resposta nos resultados do Google. Futuro me agradece por mim para responder :)
geerlingguy
O código acima não funcionará se você estiver usando o módulo de revisão
Mohammad Anwar
Não para o registro, isso não poderia estar trabalhando para o estado + fluxo de trabalho + tradução, eu tive que usar$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
adolescente
1

node_save() contém o seguinte 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()carrega a entidade (neste caso, o nó) do banco de dados; ele retorna o objeto da entidade antes de qualquer alteração feita nos módulos em execução.

O código é executado antes de qualquer pré-salvar e atualizar 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');

Nesses ganchos, é possível ver as propriedades do nó antes de qualquer alteração $node->original, por exemplo, com $node->original->status.

kiamlaluno
fonte