web-dev-qa-db-ja.com

プログラムでユーザーフィールドを追加する別の方法?

現在、これを使用してプログラムでユーザーフィールドを追加しています。

function openid_connect_entity_base_field_info(EntityTypeInterface $entity_type) {
    if ($entity_type->id() === 'user') {
        $fields['field_family_name'] = BaseFieldDefinition::create('string')
          ->setLabel(t('Family Name'))
          ->setDescription(t('Add a description'))
          ->setRevisionable(TRUE)
          ->setTranslatable(TRUE)
          ->setDisplayOptions('form', array(
            'type' => 'string_text_field',
            'weight' => 30,
            'default_value' => 0,
          ))
          ->setDisplayConfigurable('form', TRUE);
      }
return $fields;
}

しかし、サイトの管理者は次のようにモジュールをアンインストールできません: enter image description here

Webサイトの管理者がプログラムでユーザーフィールドを追加したモジュールをアンインストールできなくても、プログラムでユーザーフィールドを追加する別の方法はありますか?

5
Callum

モジュールのconfig/installディレクトリにある.ymlファイルを使用した解決策を見つけました。

1。ユーザーフィールドを作成します

[設定]-> [ユーザー]-> [アカウント設定]-> [フィールドの管理]に移動し、[+フィールドを追加]を押します。ユーザーフィールドの競合を防ぐために、フィールドに機械で読み取り可能な一意の名前を付けることをお勧めします。

enter image description here

ユーザーの編集プロファイルと登録ページに表示する場合は、[フォームディスプレイの管理]および[ディスプレイの管理]でユーザーフィールドを有効にします。

2。ユーザーフィールド設定のエクスポート

設定->開発->設定の同期->エクスポート->単一アイテムに移動します

以下のような画面が表示されたら、構成タイプを「フィールド」に設定し、構成名を作成したフィールドに設定します。

モジュールのConfig/installフォルダー(必要に応じて作成)に、以下の赤で強調表示されているファイル名にちなんだ名前の新しいファイルを作成します.

最後に、作成したファイルにymlテキストをコピーします。

enter image description here

次に、構成タイプを「フィールドストレージ」に設定し、構成名を、作成したユーザーフィールドに設定します。

モジュールのConfig/installフォルダーで(必要に応じて作成)、以下の赤で強調表示されたファイル名にちなんだ名前の新しいファイルを作成します(例では、ユーザーフィールドに別の名前を付けないでください)。

最後に、作成したファイルにymlテキストをコピーします。

enter image description here

プログラムでユーザーフィールドを作成するには、両方のYMLファイルが必要です

構成をコピーしていくつかのプロパティを変更するのではなく、プログラムで追加するユーザーフィールドごとにこれを行うことをお勧めします。

この方法では、これらのユーザーフィールドを作成したモジュールをアンインストールできます。

7
Callum

更新された回答:

モジュールのインストール時に、このフィールドをデフォルト構成として含めることができます。エクスポート可能なファイル(yamlファイル)にフィールド構成を追加することで、これらをインストールして追加できます。モジュールをアンインストールしても、フィールドとデータは残ります。

モジュールでconfig/installフォルダーを作成し、そこに構成ファイルを配置します。たとえば、フィールドfield_test_emailを追加すると、フィールドストレージとインスタンスをUserエンティティに配置します。

field.storage.user.field_test_email.ymlfield.field.user.user.field_test_email.yml

https://www.drupal.org/docs/8/creating-custom-modules/include-default-configuration-in-your-drupal-8-module

古い答え:

フィールドとそのデータを保持したい場合、短い答えはいいえ、できません(すべきではありません)。フィールドの定義、構成はその作成者である「モジュール」に結び付けられており、すべてをアンインストールすると、そのモジュールはなくなります。

Drupalはモジュールの無効化をサポートするために使用されていましたが、削除されました。こちらの説明をご覧ください: https://www.drupal.org/node/2225029

これについては、大きな議論が交わされ、双方で強力な話し合いが交わされました。これには、次のような理由があります。*無効にすると、一部のcontribモジュールのアップグレードが実際に機能しない(および機能しない)ため。 *無効化されたモジュールによって残されたデータは、後で再び有効化される>ため、整合性の問題と残骸が発生します。 >予期しない依存関係、プラグイン、フックなどが重要なときに利用できなくなったために、一部のアップグレードでデータが失われました。 ..その問題は数百の議論の長さがあるので、過度に要約するのは不公平です。

アンインストール中に、システムが破損したり、後で処理できないデータを保持したりしないように、さまざまなバリデーターが呼び出されます。あなたの場合、それらのエラーメッセージを与えるのはFieldModuleUninstallValidatorバリデーターです。

したがって、モジュールをアンインストールするには、すべてのデータを削除する必要があります。そのためにField API一括削除を使用してみてください: https://api.drupal.org/api/drupal/core!modules!field!field.purge.inc/group/field_purge/8.2.x

0
johndevman