it-swarm.com.de

So speichern Sie alle meine Knoten erneut

In D7 war es mit dem VBO-Modul einfach. Aber wie geht das mit D8? (Verwenden Sie vorzugsweise eine Ansicht, um die zu speichernden Knoten auszuwählen.)

An vielen Stellen habe ich gesehen, dass ein kleiner Teil des VBO-Moduls jetzt im D8-Kern enthalten ist, aber ich kann nicht herausfinden, wie man es verwendet (vorausgesetzt, ein einfaches Speichern sollte möglich sein).

5
Baud

Was Sie verlangen, ist in den Kernansichten enthalten, es sei denn, ich irre mich.
In einer neuen Inhaltsansicht können Sie ein Feld "Inhalt: Node Operations-Massenformular" hinzufügen, das Ihnen eine Option für "Inhalt speichern" bietet.

(enter image description here

Sie können sogar die Standardansicht "Inhalt" verwenden ...

(enter image description here

das bietet diese Option bereits ab Werk:

(enter image description here

8

Update: Ich habe gerade Resave All Nodes erstellt. Derzeit enthält es nur ein Formular zum Auslösen eines Stapelverarbeitungsprozesses zum erneuten Speichern aller Knoten ausgewählter Knotentypen. Derzeit in Alpha. Ich plane, einen Drush-Befehl (Beta) und einige Tests (Stable) hinzuzufügen.

(Drupal Resave All Nodes form screenshot


Für alle, die hierher kommen, um ein Code-Snippet zu finden (in MYMODULE.install):

use \Drupal\node\Entity\Node;

/**
 * Resave all pages.
 */
function MYMODULE_update_8001(&$sandbox) {

  // Get an array of all 'page' node IDs.
  $nids = \Drupal::entityQuery('node')
    ->condition('type', 'page')
    ->execute();

  // Load all the nodes.
  $nodes = Node::loadMultiple($nids);
  foreach ($nodes as $node) {
    $node->save();
  }
}

Das Problem dabei ist natürlich, dass Sie Ihr Speicherlimit ziemlich schnell erreichen können, wenn Sie auf diese Weise viele tausend Knoten erneut speichern. Sie müssen also einen Batch-Prozess implementieren.

Zum Glück hat hook_update_N(&$sandbox) diese Funktion bereits eingebaut. Folgen Sie dem Link für den Beispielcode.

Wenn das Ausführen Ihres Updates auf einmal möglicherweise zu einer Zeitüberschreitung von PHP) führen kann, verwenden Sie den Parameter $sandbox, Um anzuzeigen, dass die Batch-API sollte für Ihr Update verwendet werden. In diesem Fall fungiert Ihre Update-Funktion als Implementierung von callback_batch_operation() und $sandbox Als Batch-Kontextparameter Funktion, lesen Sie die Statusinformationen aus dem vorherigen Lauf von $sandbox (oder initialisieren Sie sie), führen Sie einen Teil der Aktualisierungen aus, speichern Sie den Status in $sandbox und setzen Sie $sandbox['#finished'] auf einen Wert zwischen 0 und 1, um den Prozentsatz der Fertigstellung anzugeben, oder 1, wenn es fertig ist (Sie müssen dies in jedem Durchgang explizit tun).

5
leymannx