GUIで定義されたコンテンツタイプからDrupal 7フィールドを削除する最良の方法は何ですか?update.phpの実行時に変更を複数のサーバーに伝播できるように、hook_update_Nを使用します。しかし、私は解決策を見つけることができないようです。db_drop_table()は、カスタム定義のスキーマでは意味がありますが、GUIで定義されたコンテンツタイプ/フィールドでは意味がありません。
GUIで定義されたコンテンツタイプからDrupal 7フィールドを削除する最良の方法は何ですか?update.phpの実行時に変更を複数のサーバーに伝播できるように、hook_update_Nを使用します。しかし、私は解決策を見つけることができないようです。db_drop_table()は、カスタム定義のスキーマでは意味がありますが、GUIで定義されたコンテンツタイプ/フィールドでは意味がありません。
回答:
フィールドを削除するには、2つのAPI関数があります。
field_delete_field
フィールド全体(フィールドのすべてのインスタンス)を削除するにはfield_delete_instance
フィールドのインスタンスのみを削除する-これがエンティティにアタッチされる方法です。フィールドを再利用したくない場合は、問題のコンテンツタイプでフィールドのインスタンスのみを削除するのではなく、フィールド全体を削除する方が少しすっきりするかもしれません。あなただけがその裁判官になれます。
はい、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関数は、結果が予測できないため(たとえば、更新が実行されるモジュールが無効になっている可能性があるため)、フックを実行しません。