web-dev-qa-db-ja.com

フィールドの削除に伴うワークフローの問題

次のフィールドを持つコンテンツタイプPersonがあるとします:NameAgeEmail

このコンテンツタイプはtestと呼ばれる機能によって制御されるため、ソースコントロールしてライブサイトにプッシュできます。

私のワークフローは次のようになります:

  • PersonPhoneという新しいフィールドを追加します
  • ローカルで行う:drush fu test -y
  • test.infoを編集してバージョン番号を増やします
  • 変更をリポジトリにコミットします
  • 機能をライブサイトにプッシュします(機能ファイルをコピーします)
  • 私がしているライブサイトで:drush fr test -y
  • 私がしているライブサイトで:drush cc all

次に、新しいフィールドがライブサイトのPersonに表示されます。

最初のステップでPersonのフィールドを削除した場合、フィールドはライブサイトから削除されません。どうすれば解決できますか?ライブサイトのUIから手動で削除する必要はありません。
このワークフローは正しいですか?

14
cherouvim

これは両刃の剣で、データの削除を防ぐにはこんな感じです常にいいですね。実際に解決することは何もありません。これは予想される動作です。

これは、私たちが使用して1年以上にわたって行っているワークフローと同じであり、非常にうまく機能します。それは正しいと思いますが、それは非常に主観的な答えです。

9
digital

機能が作成したコンテンツを削除する正しい方法は hook_update_N です(これはyour_module.installファイルに実装する必要があります)。


機能の主なアイデアは、コードで構成を管理することです。 hook_update_Nの使用は、フィールドの削除がコード(バージョン管理で管理できる)で行われるため、これと一致します。これに対して、同等のコマンドdrush field-delete fieldは、マネージコードから呼び出されません。これは、実行する(そして実行することを忘れない)必要がある別のコマンドライン手順です。

10
smokris

「your_feature_name.install」という新しいファイルを作成します

ファイル内で hook_update_N を宣言すると、 field_delete_field() を使用して、削除するフィールドの名前をパラメーターとして指定できます。

Update.phpを実行すると、フィールドが削除されます。

2
subhojit777

他の領域で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')) {
  ...
}
0
jimafisk