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


21

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


コンテンツタイプを定義するカスタムモジュールを作成しましたか?
iStryker

iStryker:管理インターフェイスを使用してコンテンツタイプを作成し、いくつかのフィールドを追加してから、機能を使用してエクスポートしました。しかし、これらのフィールドの1つをプログラムで削除したいと思います。
アマチュアバリスタ

D5にはcontent_field_instance_delete()関数が用意されており、ここここに記載さていますが、その関数はD7では使用できません。また、D7コアのfield.installがフィールドを削除するために使用するものが不思議です:_update_7000_field_delete_instance()-他の人が使用できないカスタム「内部」関数。フィールドとして非常に重要なものについては、どこかで利用可能な「パブリック」機能があるはずであり、それが私が探しているものです。
アマチュアバリスタ

現在、私の「候補」パブリック関数はfield_delete_instance()です。
アマチュアバリスタ

回答:


18

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

  • field_delete_field フィールド全体(フィールドのすべてのインスタンス)を削除するには
  • field_delete_instance フィールドのインスタンスのみを削除する-これがエンティティにアタッチされる方法です。

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


2
魅力のように働いた。この関数は引数を返さないため、hook_update_N()と組み合わせて使用​​する場合は、watchdog()を実行して更新の変更を記録することをお勧めします。
アマチュアバリスタ

9

はい、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()で変更します。当然、変更する必要もあります。

しかし、テーブルがまだ古い構造になっているため、now x_update_7000()の呼び出しfield_delete_instance()はエラーになります。ただし、提供されたモジュールの状況は異なります。これらのモジュールはすべてのコア更新後に常に実行される必要があり、したがって最新のコアバージョンで動作する必要があるためです。

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

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

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