Massenfeld-Update?

35

Ich habe einem Drupal 7-Inhaltstyp, der bereits viele Knoten enthält, ein neues (Text-) Feld hinzugefügt.

Wie kann ich das Feld mit einem Standardwert für alle diese Knoten füllen?

Daphshez
quelle

Antworten:

37

Mit können Sie EntityFieldQueryeine Liste von Knoten abrufen und anschließend die Felder des Knotens aktualisieren node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Wenn es sich um eine einmalige Operation handelt, können Sie die Funktion " PHP ausführen" des Devel- Moduls verwenden, um die oben genannten Aktionen auszuführen. Andernfalls können Sie ein einfaches benutzerdefiniertes Modul erstellen.

dreftymac
quelle
2
Neben der Verwendung von devel oder vbo können Sie auch "drush scr myscript.php" verwenden, um den obigen Code in einer vollständig gebooteten Umgebung auszuführen.
fietserwin
Wie ändert sich dieser Code, um die Ausführung derselben Operation in einem Begriffsreferenzfeld zu ermöglichen?
Screenack
17

Ich würde Views Bulk Operations verwenden und das "Execute Arbitrary PHP Script" verwenden, um im Wesentlichen die oben genannten Aufgaben auszuführen, aber Sie müssen nicht den gesamten zusätzlichen Code ausführen, sondern nur das kleine Snippet, das das tut, was Sie wollen (wie $object->field_foo['und'][0]['value'] = 'some_value')

rfay
quelle
9

Wenn Sie nur ein Feld mit einem bestimmten Wert aktualisieren möchten, ist die leistungsfähigere Alternative zur akzeptierten Antwort die folgende:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

Der Unterschied besteht in der Verwendung von Direkt- field_attach_presaveund field_attach_updateFunktionen, die nur das Knotenfeld korrekt aktualisieren und den Rest des Knotensicherungsprozesses überspringen. Dies hat zur Folge, dass keine Node-Presave- / Save-Hooks aufgerufen werden. Das "geänderte" Datum wird nicht auf das aktuelle Datum aktualisiert. Je nach Anwendungsfall ist es möglicherweise besser, den gesamten node_save () - Prozess zu verwenden.

Mirsoft
quelle
4

In der Tat ist VBO (Views Bulk Operations) eine gute Lösung. Darüber hinaus finden Sie in den neuesten Versionen die Option "Entitätswerte ändern", mit der Sie die Knotensprache auf einfache Weise in einem Vorgang aktualisieren können.

xaa
quelle
2

Installieren und aktivieren Sie das Modul " Views Bulk Operations" und erstellen Sie eine Ansicht mit einer Seitenanzeige.

Hinzufügen => Massenoperationen: Feld Inhalt (Content) in der Ansicht.

Verweisen

Bildbeschreibung hier eingeben

Wählen Sie die Felder aus, für die Sie den Standardwert festlegen möchten.

In deinem Fall sein Titel. Im Bild handelt es sich um Tags.

Speichern Sie die Ansicht und wechseln Sie zu der Seite, die sie erstellt hat. Wenn Sie mehr als eine Ergebnisseite haben, können Sie entweder alle Elemente auf der aktuellen Seite oder alle Elemente auf allen Seiten auswählen oder die Kästchen für die einzelnen Knoten manuell aktivieren. Mindestens ein Kontrollkästchen muss aktiviert sein, um fortzufahren.

Jetzt legen Sie den Standardwert fest und speichern ihn.

DRUPWAY
quelle