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


15

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

Bis ich jeden Knoten erneut speichere, ist der Standardwert jedoch nicht festgelegt. Daher ist eine Ansicht, die nur die Knoten anzeigen soll, bei denen das neue Feld den Standardwert verwendet, derzeit leer.

Wie kann ich die vorhandenen Knoten aktualisieren, die erstellt wurden, bevor das Feld hinzugefügt wurde, um den Standardwert für dieses Feld festzulegen?


Ich habe dieses Problem mit Views Bulk Operations und Rules gelöst, wie in diesem fantastischen Video beschrieben: commerceguys.com/resources/articles/217
DanH,

Das Modul zum erneuten Speichern von Knoten kann Ihnen dabei helfen, die Aktualisierung von Knoten zu erzwingen.
Supriya Rajgopal

Antworten:


9

Leider gibt es keine sehr einfache Möglichkeit (außer VBO / rules), aber hier ist der Code, den ich in Aktualisierungsfunktionen in meinen benutzerdefinierten Modulinstallationsdateien verwende, wenn ich Feldwerte für einen bestimmten Knotentyp vorab ausfüllen muss, nachdem ich ein neues Feld hinzugefügt habe ( in diesem Fall "Seite" Knoten):

<?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 in dieser Antwort erwähnte manuelle Methode verwendet EntityFieldQuery und lädt / speichert jeden Knoten. Mehr Drupal-y, aber weitaus weniger performant ... (Erfordert eine vollständige Knotenlade- und Speicheroperation für jeden Knoten!).


Das ist sehr traurig
AlxVallejo

Haben Sie das Field Defaults-Modul gesehen? dgo.to/field_defaults
forest

Es ist ein Fehler , Code wie diesen auszuführen, ohne auch alle betroffenen Knoten aus dem Entitätslade-Cache zu leeren: entity_get_controller('node')->resetCache($nids);- Andernfalls node_load()lädt ein nachfolgender möglicherweise veraltete Daten aus dem Cache, und jedes node_save()Objekt würde diese veralteten Daten zurück in die Datenbank schreiben .
Phils

2

Die beste Wette ist direkt im MySQL. Die Tabellen würden so aussehen:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Wenn Sie sie sich ansehen, ist das ziemlich einfach. Benötigen Sie mich, damit Sie wissen, wie die Abfrage aussehen würde, oder sind Sie von hier aus in Ordnung?


Danke Mike, nein, es ist kein Problem, ich kann mit SQL wirklich umgehen. Ich bin einfach der Meinung, dass es eine Option zum erneuten Speichern geben sollte, oder etwas, das als Massenoperation bereitgestellt wird. Ich denke, ich könnte tatsächlich die Integration von VBO und Regeln in Betracht ziehen.
DanH

Verstanden. Ich bin in einer ähnlichen Position und migriere ungefähr 30.000 Artikel von einem anderen CMS nach Drupal. Ich sah keinen Grund, ein weiteres Modul hinzuzufügen, wenn die SQL schnell und schmutzig war. Vielleicht können Sie auch eine schnelle Funktion schreiben, die node_load () für alle Ihre Knoten aufruft, was auch funktionieren kann.
Mike

0

Probieren Sie einfach die unten stehende Logik aus. Es ist viel schneller und es sind 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);

0

mit SQL, wenn man bedenkt, dass Knoten mit dem Feldwert nicht gesetzt 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 Eintragsparwert enthält, der mit der Entitäts-ID festgelegt ist, die auf den Knoten verweist

Ich habe mit SQL Insert ... Syntax auswählen

https://dev.mysql.com/doc/refman/5.5/de/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

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.

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.


0

Mit diesem Modul habe ich 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.

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.