次のフィールドを持つコンテンツタイプPerson
があるとします:Name
、Age
、Email
このコンテンツタイプはtest
と呼ばれる機能によって制御されるため、ソースコントロールしてライブサイトにプッシュできます。
私のワークフローは次のようになります:
Person
にPhone
という新しいフィールドを追加しますdrush fu test -y
test.info
を編集してバージョン番号を増やしますdrush fr test -y
drush cc all
次に、新しいフィールドがライブサイトのPerson
に表示されます。
最初のステップでPerson
のフィールドを削除した場合、フィールドはライブサイトから削除されません。どうすれば解決できますか?ライブサイトのUIから手動で削除する必要はありません。
このワークフローは正しいですか?
これは両刃の剣で、データの削除を防ぐにはこんな感じです常にいいですね。実際に解決することは何もありません。これは予想される動作です。
これは、私たちが使用して1年以上にわたって行っているワークフローと同じであり、非常にうまく機能します。それは正しいと思いますが、それは非常に主観的な答えです。
機能が作成したコンテンツを削除する正しい方法は hook_update_N です(これはyour_module.install
ファイルに実装する必要があります)。
機能の主なアイデアは、コードで構成を管理することです。 hook_update_N
の使用は、フィールドの削除がコード(バージョン管理で管理できる)で行われるため、これと一致します。これに対して、同等のコマンドdrush field-delete field
は、マネージコードから呼び出されません。これは、実行する(そして実行することを忘れない)必要がある別のコマンドライン手順です。
「your_feature_name.install」という新しいファイルを作成します
ファイル内で hook_update_N を宣言すると、 field_delete_field() を使用して、削除するフィールドの名前をパラメーターとして指定できます。
Update.phpを実行すると、フィールドが削除されます。
他の領域でfield_phone
を使用している場合は、Personコンテンツタイプから削除するだけで、サイトから完全に削除することはできません。次のように、機能のフォルダーにYOUR_FEATURE_NAME.install
ファイルを手動で作成します。
/**
* Implements hook_update_N().
*
* Removes field_phone from Person content type.
*/
function YOUR_FEATURE_NAME_update_7001() {
if ($instance = field_info_instance('node', 'field_phone', 'person')) {
field_delete_instance($instance);
}
field_purge_batch(500);
features_revert_module('YOUR_FEATURE_NAME');
}
これをPerson Content TypeではなくPerson Paragraphから削除する場合は、最初の条件ステートメントを次のように変更できます。
if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
...
}