Wie aktualisiere ich den Knotenstatus?

7

Ich verwende Daten von JSON, um neue Knoten zu erstellen oder Felder auf vorhandenen zu aktualisieren, wenn Knoten auf meiner Drupal 8-Website vorhanden sind. Wenn ich also eine Methode zum Aktualisieren von Knoten verwende, muss ich die Array-Knoten-ID aktualisierter Knoten und Schlüssel von Feldern mit geänderten Werten in diesem Knoten speichern.

Nach Abschluss der Aktualisierung muss ich eine Tabelle mit allen Knoten dieses Inhaltstyps drucken, wobei die Felder der aktualisierten Knoten einen anderen Stil haben müssen (Farbe, Hintergrund usw.).

Also, wenn mein alter Knoten body = "body1"und description = "description 1"und neuer Knoten haben body = "body2"und description = "description 1"nachdem das Update abgeschlossen ist, muss ich Ausgabe wie folgt erhalten:

Geben Sie hier die Bildbeschreibung ein

Hier ist ein Beispiel:

$node = \Drupal\node\Entity\Node::load($nid);
$node->set("body", 'New body text');
$node->set("description", 'New value');
$node->save();

Irgendein Vorschlag?

Hinweis : Wenn ich verwende, $node->save();wenn alle aktualisierten Werte gleich sind, wird nichts geändert (das Datum des Knotens im Inhalt des Admin-Panels ist das gleiche wie vor der Aktualisierung). Wenn die Werte jedoch unterschiedlich sind, muss ich nur die Knoten-ID, Schlüssel und Werte der geänderten Felder in speichern Array.

StevanRS
quelle
Nicht wirklich klar, wann und wie Sie diese Ausgabe haben möchten, aber wie in einer Antwort vorgeschlagen, wenn Sie das Diff-Modul verwenden und eine neue Revision speichern, erhalten Sie einen Unterschied zwischen den alten und neuen Werten für jede Änderung, die Sie jemals vorgenommen haben (vorausgesetzt, Sie haben es als neue Revision gespeichert)
Berdir

Antworten:

7

Um den Status festzulegen, können Sie die Methode setPublished () verwenden:

öffentliche Funktion Node :: setPublished

Legt den veröffentlichten Status eines Knotens fest.

Parameter

bool $ Publiziert : TRUE , um diesen Knoten auf veröffentlichtzu setzen, FALSE , um ihn auf unveröffentlicht zu setzen.

In Ihrem Fall:

$node = \Drupal\node\Entity\Node::load($nid);
$node->set("body", 'New body text');
$node->set("field_name", 'New value');
$node->setPublished(TRUE);
Adrian Cid Almaguer
quelle
Der Status ist in Ordnung, ich habe dies in meinem Code. Ich brauche etwas anderes, zum Beispiel, wenn ich Daten von JSON erhalte, einige Felder haben dieselben Werte, ich muss nur wissen, welches Feld einen anderen Wert als das vorherige hat.
StevanRS
@StevanRS Ich denke, Sie müssen Ihre Frage besser erklären und mich dann informieren.
Adrian Cid Almaguer
Der Knotenstatus in Drupal bezieht sich auf den veröffentlichten Status. Ohne Klärung ist dies die Antwort. Eine andere Möglichkeit, nach einem Knoten zu suchen, der aktualisiert wurde, ohne den veröffentlichten Status zu überprüfen, besteht darin, seine changedEigenschaft zu überprüfen , den Zeitpunkt, zu dem er zuletzt geändert wurde.
Kevin
@Adrian Cid Almaguer, wenn ich $ node-> save () benutze; Wenn alle aktualisierten Werte gleich sind, wird nichts geändert (das Datum des Knotens im Inhalt des Admin-Panels ist das gleiche wie vor der Aktualisierung), aber wenn die Werte unterschiedlich sind, muss ich nur die Knoten-ID, die Schlüssel und die Werte der geänderten Felder im Array speichern.
StevanRS
1
Beachten Sie, dass die Übergabe eines true/ falsean ab 8.3.x veraltet$node->setPublished() ist . Verwenden Sie stattdessen zum Veröffentlichen und zum Aufheben der Veröffentlichung . $node->setPublished()$node->setUnpublished()
Donut
2

Speichern Sie eine neue Revision des aktualisierten Knotens? Vielleicht können Sie das Diff-Modul verwenden, um die Änderungen zwischen dem aktuellen und dem vorherigen Knoten anzuzeigen? Dies ist keine gründliche Lösung, könnte aber möglicherweise ein nützlicher Hinweis für Sie sein.

absoludo
quelle
0

Vergessen Sie nicht den Knoten-> save (), sonst werden Ihre Knotenänderungen ignoriert.

$node = \Drupal\node\Entity\Node::load($nid);
$node->set("body", 'New body text');
$node->set("field_name", 'New value');
$node->setPublished(TRUE);
$node->save();
Blaine Lang
quelle