Wie kann ich feststellen, wann ein Knoten von "Veröffentlicht" in "Nicht veröffentlicht" geändert wurde?

17

In hook_node_update () kann ich den 'Status' eines Knotens (ob veröffentlicht oder nicht) nach dessen Aktualisierung leicht erkennen.

Allerdings gibt es eine einfache Möglichkeit , um zu sehen , zu überprüfen , ob der aktualisierte Knoten wurde veröffentlicht, aber jetzt nicht wahr? (Oder umgekehrt)?

Ich denke, Regeln haben möglicherweise eine Bedingung für "Knotenwert hat sich geändert" oder etwas in diese Richtung, aber ich möchte dies programmgesteuert tun.

Ich habe dieses Problem von fago (Entwickler von Rules) auf drupal.org gefunden, das sich in Drupal 7 damit zu befassen scheint, aber eine nette Erklärung wäre wünschenswert.

Geerlingguy
quelle

Antworten:

31

Keine Ursache. Nachdem ich das oben verlinkte Problem durchgelesen hatte (insbesondere Kommentar Nr. 38 ), stellte ich fest, dass das $ node-Objekt (tatsächlich jede Entität) die zwischengespeicherte 'Original'-Kopie in $ entity-> original speichert.

Ich wollte also feststellen, ob sich ein Knoten von "status = 1" in "status = 0" geändert hat (dies geschieht, wenn der Knoten nicht veröffentlicht ist), und der folgende Code tut dies:

<?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
quelle
3
Ich muss aufhören, meine eigenen Fragen zu beantworten
;-)
5
Warum? Es war immer noch hilfreich für mich, im Wert von +1 ;-)
uwe
Heh, das ist ungefähr das 10. Mal, dass ich in den Google-Ergebnissen auf meine Antwort gelandet bin. Future me Danke an mir vorbei für die Beantwortung :)
Geerlingguy
Der obige Code funktioniert nicht, wenn Sie das Revisionsmodul verwenden
Mohammad Anwar
Für die Aufzeichnung, dies konnte nicht für Status + Workflow + Übersetzung funktionieren, ich musste verwenden$entity->original->getTranslation($lng)->status->value == 0 && $entity->getTranslation($lng)->status->value == 1
Teenager
1

node_save() enthält den folgenden Code.

  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()lädt die Entität (in diesem Fall den Knoten) aus der Datenbank; Es gibt das Entitätsobjekt zurück, bevor Änderungen an den ausgeführten Modulen vorgenommen werden.

Der Code wird vor dem Speichern und Aktualisieren von Hooks ausgeführt.

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 diesen Hooks ist es möglich, die Knoteneigenschaften zu sehen, bevor Änderungen vorgenommen werden $node->original, z. B. mit $node->original->status.

kiamlaluno
quelle