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.

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.
    }
  }
}
?>

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.