web-dev-qa-db-ja.com

コンテンツタイプからフィールドを削除する最良の方法

Drupal 7フィールドをGUIを介して定義されたコンテンツタイプから削除する最善の方法は何ですか?update.phpの実行時に変更が複数のサーバーに伝播できるように、hook_update_Nを使用したいと思います。ただし、解決策が見つからないようです。db_drop_table()は、カスタム定義スキーマでは意味がありますが、GUIで定義されたコンテンツタイプ/フィールドでは意味がありません。

20
amateur barista

フィールドを削除する2つのAPI関数があります。

  • field_delete_field フィールド全体(フィールドのすべてのインスタンス)を削除するには
  • field_delete_instance フィールドのインスタンスのみを削除するには-エンティティに接続する方法です。

フィールドを再利用したくない場合は、問題のコンテンツタイプのフィールドのインスタンスだけを削除するのではなく、フィールド全体を削除する方が少しクリーンかもしれません。あなただけがその裁判官になることができます。

18
googletorp

はい、 field_delete_instance() はフィールドインスタンスを削除する関数です。

残りのインスタンスがない場合、field_delete_instance()は自動的にfield_delete_field()を呼び出すため、field_delete_instance()が必要となる可能性が最も高いことに注意してください。

_update_7000_field_delete_instance()は、コア更新関数用に設計されています。例:更新関数x_update_7000()では、field_delete_instance()を使用しています。次に、x_update_7001()で_{field_config}_テーブルを一貫性のない方法で変更し、field_delete_instance()も変更する必要があることは明らかです。

ただし、x_update_7000()からfield_delete_instance()を呼び出すと、テーブルがまだ古い構造になっているため、エラーが発生します。ただし、コントリビュートされたモジュールの状況は異なります。すべてのコアアップデートの後に後に実行する必要があり、最新のコアバージョンで動作する必要があるためです。

ただし、これは、更新関数で使用している独自のAPI関数に使用したいパターンです。

また、これらの_update関数は、結果が予測できないため(たとえば、更新が実行されるモジュールが無効になっている可能性があるため)、フックを実行しません。

9
Berdir