Antworten:
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_foo
der Computername des Feldes ist. Sie müssen diese Spalte in den Tabellen field_revision_field_foo
und aktualisieren field_data_field_foo
.
Der Wert für die Spalte ist ein Computername, der als Spalte format
in der filter_format
Tabelle 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_format
Wert bestimmen : http://YOURSITE.com/admin/config/content/formats - Link konfigurieren - Nummer oder Zeichenfolge in URL ist Ihr new_format.
Cache nach dem Aktualisieren leeren .
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.
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
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'));
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 _format
Spalte 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 [...] union
Anweisung 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;"
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 text
old_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;"
field_cache_clear();
nach Änderungen infield_data_...
undfield_revision_...
Tabellen tun