フィールドの削除に関する機能のワークフローの問題


14

私は、コンテンツの種類があるとPersonフィールドを持つと:NameAgeEmail

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

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

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

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

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


1
drush fu test -y --version-incrementを使用して、バージョン番号を自動的にインクリメントします
Mike

回答:


9

これは両刃の剣で、常に良いことであるデータの削除を防ぐのに似ています。本当に解決するものはありません。これは予想される動作です。

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


そして、本当にフィールドを削除したい場合はどうなりますか?更新フックを調べる必要がありますか?(私はD7初心者です)。
cherouvim

3
更新フックが理想的であるか、手動で削除します。
デジタル

2
OK、私もできるdrush field-delete field
-cherouvim

@cherouvimでは、機能を再作成するたびにそれを行う必要がありますか?
AlxVallejo

機能の.installファイルのhook_update_N()が機能します。
マイク

10

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


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


どうして?ではないだろうdrush field-delete fieldうまく動作しますか?
-cherouvim

5
確かに、それはうまくいくでしょうし、もっと簡単な解決策かもしれません。ただし、機能の主なアイデアは、コードで構成を管理することです。hook_update()フィールドの削除はコード内にあるため(バージョン管理で管理できる)、drushコマンドはマネージコードから呼び出されないため、使用方法は一貫しています。これは、実行する必要のある(実行することを忘れないようにする)別のコマンドラインステップです。
smokris

機能のどのファイルでhook_update()を使用しますか?hook_update()は、パラメータとしてノードオブジェクトを受け取るため、機能を有効にしている間にノードオブジェクトを提供することはできません。
subhojit777

@ subhojit777:おっと、間違ったフックのドキュメントページにリンクしました。リンクを修正しました。のドキュメントをご覧くださいhook_update_N
スモクリス

@smokris :)私は私のフックでそのフックに言及した
-subhojit777

2

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

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

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


0

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コンテンツタイプではなくPerson Paragraphから削除する場合、最初の条件ステートメントを次のように変更できます。

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.