web-dev-qa-db-ja.com

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

入力形式を変更する必要のあるノードがたくさんあります。手動で変更できますが、2014年のクリスマスまでに完了しません。

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

17
mortendk

特にこのフォーマットをより緩やかなフィルターのセットに変更する場合は、このまとめを行うと潜在的なセキュリティリスクが生じると言って、この回答の前置きをします。テキスト形式は、保存中ではなく、表示中にフィールド出力を変更します。そのため、たとえば、フィールドに送信された以前にエスケープされたHTMLまたはPHPは、誤ってまたは意図的にフィルターを完全なHTMLまたはPHPコードに設定した場合、そのままレンダリング/実行されます。

このため、テキスト形式を変更しても、Drupalは既存のすべてのノードを自動的に更新しません。同様のシナリオでのテキスト形式の動作は 未解決の問題 のままです。

もう一度:注意してください、ドラゴンがいます

そうは言っても、各フィールドはfield_foo_formatという名前の列としてテキストを格納します。ここで、field_fooはフィールドのマシン名です。テーブルfield_revision_field_fooおよびfield_data_field_fooの列を更新する必要があります。

列の値は、filter_formatテーブルの列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.クリア更新後のキャッシュ。

20
user7

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

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

私にとって、次のことがうまくいきました:

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

1
Ámon Tamás

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

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

0
duck

おそらく、どのフィールドを更新する必要があるかを知りたいと思うでしょう。おそらく、データのロギングやチェックを行うためです。これを行うには、__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;"
_
0
noobish

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