it-swarm.com.de

Wie kann ich erkennen, wenn ein Knoten von "Veröffentlicht" in "Unveröffentlicht" geändert wird?

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

Gibt es jedoch eine einfache Möglichkeit, um zu überprüfen, ob der aktualisierte Knoten veröffentlicht wurde , jetzt jedoch nicht? (Oder umgekehrt)?

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

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

16
geerlingguy

Keine Ursache. Nachdem ich das oben verlinkte Problem gelesen hatte (insbesondere Kommentar # 38 ), stellte ich fest, dass das $ node-Objekt (eigentlich 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 führt dies aus:

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

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 laufenden 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 vor jeder Änderung von $node->original Zu sehen, beispielsweise mit $node->original->status.

1
kiamlaluno