it-swarm.com.de

Aktualisieren Sie alle Knoten mit einem Standardfeld, nachdem Sie dem Inhaltstyp ein neues Feld hinzugefügt haben

Ich habe einen vorhandenen Inhaltstyp mit mehreren Knoten. Ich habe gerade ein neues boolesches Feld mit dem Standardwert "off" hinzugefügt.

Bis ich jedoch jeden Knoten erneut speichere, ist der Standardwert nicht festgelegt. Daher ist eine Ansicht, in der nur die Knoten angezeigt werden sollen, auf denen das neue Feld den Standardwert verwendet, derzeit leer.

Wie kann ich die vorhandenen Knoten aktualisieren, die vor dem Hinzufügen des Felds erstellt wurden, um dieses Feld auf seinen Standardwert zu setzen?

15
DanH

Leider gibt es keine sehr einfache Möglichkeit, dies zu tun (außer VBO/Regeln), aber hier ist der Code, den ich in Aktualisierungsfunktionen in meinen benutzerdefinierten Modulinstallationsdateien verwende, wenn ich nach dem Hinzufügen eines neuen Felds Feldwerte für einen bestimmten Knotentyp vorab ausfüllen muss ( in diesem Fall 'Seitenknoten'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Eine andere manuelle Methode, die in diese Antwort erwähnt wird, verwendet EntityFieldQuery und lädt/speichert jeden Knoten. Mehr Drupal-y, aber viel weniger performant ... (erfordert eine vollständige Knotenlast und Speicheroperation für jeden Knoten!).

10
geerlingguy

Die beste Wette ist direkt in der MySQl. Die Tabellen würden aussehen wie:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Wenn Sie sie sich ansehen, ist das ziemlich einfach - brauchen Sie mich, um Ihnen den Einstieg in die Abfrage zu erleichtern, oder sind Sie von hier aus in Ordnung?

2
Mike

Probieren Sie einfach die folgende Logik aus. Es ist viel schneller und es werden auch alle Hook-Implementierungen umgangen. weitere Details . Sie können eine einfache direkte db_select-Abfrage schreiben, um alle NIDs abzurufen und mit diesem Beispielcode zu schleifen.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

verwenden von SQL, wenn man bedenkt, dass Knoten mit dem nicht festgelegten Feldwert sind

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document ist die Tabelle, die meinem Feld entspricht und einen Eintrag mit einem Wert enthält, der mit der Entitäts-ID festgelegt ist, die auf den Knoten verweist

ich habe SQL Insert verwendet ... Syntax auswählen

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
0
Matoeil

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

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

Verweisen

(enter image description here

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

Speichern Sie die Ansicht und wechseln Sie zu der von ihr erstellten Seite. Wenn Sie mehr als eine Ergebnisseite haben, können Sie alle Elemente auf der aktuellen Seite, alle Elemente auf allen Seiten auswählen oder manuell Kontrollkästchen aktivieren, die einzelnen Knoten entsprechen. Zum Fortfahren muss mindestens ein Kontrollkästchen aktiviert sein.

Jetzt legen Sie den Standardwert fest und speichern ihn.

0
DRUPWAY

Ich habe mit diesem Modul eine einfache Möglichkeit gefunden, Felder im Inhaltstyp zu aktualisieren: Feldstandards

Siehe Screenshot. Sie können vorhandene Inhalte mit den Standardwerten aktualisieren oder vorhandene Werte beibehalten.

Ich habe es auf D7 getestet und es funktioniert.

(enter image description here

0