3000+ノードの入力形式を変更する


18

入力フォーマットを変更する必要のあるノードがたくさんあります。手作業で変更できますが、2014年のクリスマスまでには完了しません。

Drupalはその情報をどこに保存していますか?SQLクエリを使用して入力形式を一瞬で変更するにはどうすればよいですか?

回答:


20

このアンマスを行うと潜在的なセキュリティリスクが生じると言うことで、この答えの前書きになります。特に、形式をより緩やかなフィルターセットに変更する場合はそうです。テキスト形式は、保存中ではなく表示中にフィールド出力を変更します。したがって、たとえば、誤ってまたは意図的にフィルターを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.更新後のキャッシュのクリアです。


1
いい答えです。また、テーブルのfield_cache_clear();変更後に行う必要がありますfield_data_...field_revision_...
milkovsky 14

4

特定のタイプのすべてのノードに対してループを作成して、この方法を試してください。

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

1

Mortenがここで行ったのと同じ状況に陥っただけで、D6 => D7のアップグレードで、明らかに入力フォーマットが完了しませんでした。

ここでの回答よりも粗いアプローチを取り、DBスキーマを実行し、文字列「format」を含むすべての列を更新し、D6形式の値(1、2、3)をD7マシン名(filtered_htmlfull_htmlplain_text)。

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

のマッピングをサポートするためにハードコードされています

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

また、「format」という名前のフィールド(「date_format」などのフィールドを書き換えようとする場合がありますが、値が「2」の日付形式がある場合はそれが問題です)。


1

私にとっては、以下がうまくいきました:

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を変更する必要があります


これは魅力のように機能しましたが、効果を確認するにはキャッシュをクリアする必要がありました。ありがとうございました。
シャシカント18年

0

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'));

0

おそらく、データのログ記録やチェックを行うために、更新が必要なフィールドを知りたいでしょう。これを行うには、_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 textold_format を含んでいた!テキスト処理がに設定されているフィールドではFiltered text (user selects text format)、さらに新しいデフォルト値を選択して[保存]を押す必要があります。

フィルターを削除した後、フィルターキャッシュをクリアする必要があります(繰り返しますが、drush cc all

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

またはブラシで:

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');

私のためにトリックをしました。キャッシュをクリアすることを忘れないでください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.