Ändern Sie das Eingabeformat für mehr als 3000 Knoten


18

Ich habe viele Knoten, deren Eingabeformat geändert werden muss - ich könnte das von Hand tun, aber dann werde ich nicht vor Weihnachten 2014 fertig sein.

Wo speichert Drupal diese Informationen? Wie kann ich das Eingabeformat mit einer SQL-Abfrage in Sekundenbruchteilen ändern?

Antworten:


20

Ich gehe dieser Antwort voran, indem ich sage, dass diese Massenproduktion ein potenzielles Sicherheitsrisiko darstellt, insbesondere wenn Sie das Format in eine mildere Gruppe von Filtern ändern. Textformate ändern die Feldausgabe während der Anzeige, nicht während des Speicherns. So werden beispielsweise alle zuvor an ein Feld gesendeten HTML- oder PHP-Zeichen mit Escape-Zeichen direkt gerendert / ausgeführt, wenn Sie den Filter versehentlich oder absichtlich auf Vollständigen HTML- oder PHP-Code eingestellt haben.

Aus diesem Grund aktualisiert Drupal nicht automatisch alle vorhandenen Knoten, wenn Sie ein Textformat ändern. Das Verhalten von Textformaten in ähnlichen Szenarien ist immer noch ein offenes Thema .

Also nochmal: Vorsicht, es gibt Drachen.

Dabei speichert jedes Feld den Text als Spalte mit dem Namen field_foo_format, wobei field_fooder Computername des Feldes ist. Sie müssen diese Spalte in den Tabellen field_revision_field_foound aktualisieren field_data_field_foo.

Der Wert für die Spalte ist ein Computername, der als Spalte formatin der filter_formatTabelle definiert ist. Das Aktualisieren aller Felder wäre also eine Frage wie:

UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';

für jedes Feld, das geändert werden muss.

Hier können Sie den new_formatWert bestimmen : http://YOURSITE.com/admin/config/content/formats - Link konfigurieren - Nummer oder Zeichenfolge in URL ist Ihr new_format.Cache nach dem Aktualisieren leeren .


1
Gute Antwort. Sie sollten auch field_cache_clear();nach Änderungen in field_data_...und field_revision_...Tabellen tun
Milkovsky

4

Versuchen Sie es auf diese Weise, indem Sie eine Schleife für alle Knoten eines bestimmten Typs erstellen:

$node = node_load(nid);
$node->body[$node->language][0]['format'] = 'full_html'; // plain_text
node_save($node);

1

Bin gerade in die gleiche Situation geraten wie Morten hier, mit einem D6 => D7-Upgrade, bei dem die Eingabeformate anscheinend nicht fertig waren.

Hat einen gröberen Ansatz gewählt als die hier bereits gegebenen Antworten und ein Modul geschrieben, das das DB-Schema durchlief und alle Spalten mit der Zeichenfolge 'format' aktualisierte und die Werte des D6-Formats (1, 2, 3) durch D7-Maschinennamen ersetzte ( filtered_html, full_html, plain_text).

https://gist.github.com/xurizaemon/9824872

Hardcoded zur Unterstützung des Mappings von

1 => filtered_html, 
2 => full_html,
3 => plain_text,

Möglicherweise versuchen Sie auch, Felder mit dem Namen "format" neu zu schreiben (z. B. "date_format"). Wenn Sie jedoch ein Datumsformat mit dem Wert "2" haben, ist dies Ihr Problem.


1

Für mich hat folgendes geklappt:

update `field_revision_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'
update `field_data_body` set `body_format` = 'new_body_forma' WHERE `bundle` = 'node_type'

Natürlich müssen Sie die new_body_forma und den node_type ändern


Dies funktionierte wie ein Zauber, aber ich musste die Caches leeren, um den Effekt zu sehen. Vielen Dank.
Shasi kanth

0

Sie können den folgenden Code verwenden, wenn Sie das entity.module installiert haben.

// I'm using node_save($node); 
$wrapper = entity_metadata_wrapper('node', $node->nid); 
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));

0

Vermutlich möchten Sie wissen, welche Felder aktualisiert werden müssen, möglicherweise, um Daten zu protokollieren oder zu überprüfen. Rufen Sie dazu alle Tabellen- und Spaltennamen ab, die eine _formatSpalte enthalten :

select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';

Mit diesen Daten können Sie separate Abfragen von diesen Werten erstellen. Überprüfen Sie zuerst die Ausgabe. Möglicherweise müssen Sie einige Einträge entfernen, die sich nicht auf Inhalt / Überarbeitungen beziehen. Ich empfehle die Verwendung eines Regex-fähigen Editors, um die Abfragen zu erstellen. Ich habe die Daten in eine große select [...] unionAnweisung umgewandelt und dann Aktualisierungsabfragen ausgeführt.

Die Verwendung dieses Ansatzes ersparte mir einige Zeit, als ich Tausende von Knoten / Revisionen aktualisieren musste. Denken Sie daran, den Feld-Cache zu leeren (NICHT abgedeckt durch drush cc all!):

field_cache_clear();

Oder mit Drush:

drush sqlq "truncate table cache_field;"

Entfernen Sie auch den Textfilter

Wenn Sie auch einen Textfilter deaktivieren, müssen Sie anschließend das Standardtextformat für CTs ändern, in denen Felder verwendet wurden. Wenn Sie dies nicht tun, erhalten Ihre Benutzer Nachrichten mit verweigerter Berechtigung in den Feldern, in denen das verwendet wurde old_format. Ich habe diese Abfrage durchgeführt, um die Schuldigen zu finden:

select * from field_config_instance where `data` LIKE '%old_format%';

Um die Änderungen vorzunehmen, fand ich es einfacher, die Benutzeroberfläche zu verwenden, um die einzelnen Feldeinstellungsseiten aufzurufen und Speichern zu drücken (die Daten werden als Longblob gespeichert und konnten aufgrund der besseren Moduldateninjektionen nur schwer gesucht und ersetzt werden). Sogar Felder, für die die Textverarbeitung auf " Plain textold_format" eingestellt war, enthielten das Format "old_format". Für die Felder, für die Textverarbeitung eingestellt ist, Filtered text (user selects text format)müssen Sie zusätzlich einen neuen Standardwert auswählen und auf Speichern klicken.

Sie sollten den Filter-Cache löschen, nachdem Sie einen Filter entfernt haben (wieder nicht abgedeckt durch drush cc all!):

cache_clear_all('*', 'cache_filter', TRUE);

Oder mit Drush:

drush sqlq "truncate table cache_filter;"

0
update field_revision_body set body_format = 'full_html' WHERE bundle IN ('book','page');
update field_data_body set body_format = 'full_html' WHERE bundle IN ('book','page');

hat den Trick für mich getan. Vergiss nicht, die Caches zu leeren

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.