Jak mogę wykryć, kiedy węzeł zostanie zmieniony z „Opublikowane” na „Niepublikowane”?

17

W hook_node_update () mogę łatwo określić „status” węzła (czy jest opublikowany czy nie) po jego aktualizacji.

Czy istnieje jednak prosty sposób sprawdzenia, czy zaktualizowany węzeł został opublikowany, ale teraz nie jest? (Lub odwrotnie)?

Myślę, że Reguły mogą mieć pewien warunek dla „wartość węzła uległa zmianie” lub coś w tym stylu, ale chciałbym to zrobić programowo.

Znalazłem ten problem autorstwa fago (twórcy reguł) na drupal.org, który wydaje się sobie z tym radzić w Drupal 7, ale mile widziane wyjaśnienie byłoby mile widziane.

geerlingguy
źródło

Odpowiedzi:

31

Nieważne. Po przeczytaniu powyższego problemu (zwłaszcza komentarza nr 38 ) odkryłem, że obiekt $ node (dowolny byt, właściwie) przechowuje „oryginalną” kopię w pamięci podręcznej w $ entity-> original.

Chciałem więc wykryć, czy węzeł zmienił się ze „status = 1” na „status = 0” (dzieje się tak, gdy węzeł nie jest opublikowany), a następujący kod to robi:

<?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
źródło
3
Muszę przestać odpowiadać na własne pytania ;-)
geerlingguy,
5
dlaczego? Nadal był dla mnie pomocny, wart +1 ;-)
uwe
Heh, to już około 10. raz trafiłem na własną odpowiedź w wynikach Google. Przyszłość mi dziękuje za mnie za odpowiedź :)
geerlingguy
Powyższy kod nie zadziała, jeśli używasz modułu sprawdzającego
Mohammad Anwar
Dla przypomnienia, to nie mogło działać dla statusu + przepływu pracy + tłumaczenia, musiałem użyć$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teenage
1

node_save() zawiera następujący kod.

  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()ładuje byt (w tym przypadku węzeł) z bazy danych; zwraca obiekt encji przed wszelkimi zmianami wprowadzonymi z działających modułów.

Kod jest wykonywany przed jakimkolwiek zapisem wstępnym i aktualizacją przechwytuje.

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

W tych zaczepach można zobaczyć właściwości węzła przed każdą zmianą $node->original, na przykład za pomocą $node->original->status.

kiamlaluno
źródło