回答:
このアンマスを行うと潜在的なセキュリティリスクが生じると言うことで、この答えの前書きになります。特に、形式をより緩やかなフィルターセットに変更する場合はそうです。テキスト形式は、保存中ではなく表示中にフィールド出力を変更します。したがって、たとえば、誤ってまたは意図的にフィルターをFull HTMLまたはPHPコードに設定した場合、フィールドに送信された以前にエスケープされたHTMLまたはPHPは、レンダリング/実行されます。
このため、テキスト形式を変更しても、Drupalは既存のすべてのノードを自動的に更新しません。同様のシナリオでのテキスト形式の動作は未解決の問題です。
繰り返しますが、注意してください、ドラゴンがいます。
そうは言っても、各フィールドはテキストをという名前の列として保存しますfield_foo_format
。ここfield_foo
で、はフィールドのマシン名です。テーブルfield_revision_field_foo
との列を更新する必要がありますfield_data_field_foo
。
列の値format
は、filter_format
テーブルの列として定義されているマシン名です。したがって、すべてのフィールドを更新することは、次のようなクエリの問題になります。
UPDATE field_revision_foo SET field_foo_format = 'new_format';
UPDATE field_data_foo SET field_foo_format = 'new_format';
変更が必要なフィールドごとに。
new_format
ここで値を決定できます:http : //YOURSITE.com/admin/config/content/formats-リンクの構成-URLの数値または文字列は、new_format.
更新後のキャッシュのクリアです。
Mortenがここで行ったのと同じ状況に陥っただけで、D6 => D7のアップグレードで、明らかに入力フォーマットが完了しませんでした。
ここでの回答よりも粗いアプローチを取り、DBスキーマを実行し、文字列「format」を含むすべての列を更新し、D6形式の値(1、2、3)をD7マシン名(filtered_html
、full_html
、plain_text
)。
https://gist.github.com/xurizaemon/9824872
のマッピングをサポートするためにハードコードされています
1 => filtered_html,
2 => full_html,
3 => plain_text,
また、「format」という名前のフィールド(「date_format」などのフィールドを書き換えようとする場合がありますが、値が「2」の日付形式がある場合はそれが問題です)。
私にとっては、以下がうまくいきました:
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'
もちろん、new_body_formaとnode_typeを変更する必要があります
entity.moduleがインストールされている場合は、次のコードを使用できます。
// I'm using node_save($node);
$wrapper = entity_metadata_wrapper('node', $node->nid);
$wrapper->body->set(array('value' => body_text, 'format'=>'full_html'));
おそらく、データのログ記録やチェックを行うために、更新が必要なフィールドを知りたいでしょう。これを行うには、_format
列を含むすべてのテーブル名と列名を取得します。
select distinct TABLE_NAME, column_name
from information_schema.columns
where TABLE_SCHEMA = 'my_drupal_database_name' and column_name like '%_format';
このデータを使用して、これらの値から個別のクエリを作成できます。最初に出力を確認してください。コンテンツ/リビジョンに関係のないエントリを削除する必要がある場合があります。正規表現対応のエディターを使用してクエリを作成することをお勧めします。データを大きなselect [...] union
文に変換し、それに対して更新クエリを実行しました。
このアプローチを使用すると、数千のノード/リビジョンを更新する必要が生じたとき、かなり時間が節約されました。フィールドキャッシュをクリアすることを忘れないでください(drush cc all
!
field_cache_clear();
またはブラシで:
drush sqlq "truncate table cache_field;"
テキストフィルターも廃止する場合は、その後、フィールドを使用したCTのデフォルトのテキスト形式を変更する必要があります。これを行わないと、ユーザーはを使用したフィールド内で許可拒否メッセージを受け取りますold_format
。犯人を見つけるためにこのクエリを実行しました。
select * from field_config_instance where `data` LIKE '%old_format%';
変更を行うには、インターフェイスを使用して各フィールド設定ページにアクセスし、(保存)を押す方が簡単であることがわかりました(データはlongblobとして保存され、より良い形式のモジュールデータインジェクションのために検索や置換が面倒でした)。テキスト処理が設定されているフィールドでさえPlain text
old_format を含んでいた!テキスト処理がに設定されているフィールドではFiltered text (user selects text format)
、さらに新しいデフォルト値を選択して[保存]を押す必要があります。
フィルターを削除した後、フィルターキャッシュをクリアする必要があります(繰り返しますが、drush cc all
!
cache_clear_all('*', 'cache_filter', TRUE);
またはブラシで:
drush sqlq "truncate table cache_filter;"
field_cache_clear();
変更後に行う必要がありますfield_data_...
field_revision_...