web-dev-qa-db-ja.com

データを持つベースフィールドを追加したモジュールをアンインストールする方法

私のモジュールは、ベースフィールド「myfield」をコア「ファイル」コンテンツエンティティに追加します。

開発目的でモジュールをアンインストールする必要がありますが、drushが「エンティティタイプファイルのフィールドmyfieldのデータがあります」と言ってモジュールのアンインストールを拒否するため、実行できません。

私の理解では、これは既知の問題です。

  • 私のモジュールは所有していないエンティティにこのフィールドを追加するため、このアンインストールはコアuninnstallプロシージャによって自動的には処理されません。

  • したがって、私のモジュールには、\ Drupal :: entityDefinitionUpdateManager()-> uninstallFieldStorageDefinitionを使用してフィールドのアンインストールをトリガーするhook_uninstallが必要です

  • ただし、フィールドにまだデータがある場合は、フィールドをアンインストールできないため、最初にデータを削除する必要があります。

  • ただし、フィールドデータを消去するシステムは現在、基本フィールドではなくバンドルフィールドに対してのみ機能します。

  • フィールドデータを削除する方法は他にもありますが、大量のデータには対応していません。

  • したがって、モジュールをアンインストールする確実な方法はなく、Drupalコアはアンインストールを拒否するのに適切です。

これらすべてを踏まえて、開発目的で(Drupalの再インストールを除く)必要がある場合、どのようにしてアンインストールできますか?

作成方法は次のとおりです。

Mymodule.moduleで:

function mymodule_entity_base_field_info(\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'file') {
    $fields = array();
    $fields['myfield'] = BaseFieldDefinition::create('boolean')
      ->setLabel(t('My field'))
    return $fields;
  }
}

Mymodule.install:

  $entity_manager = \Drupal::entityManager();
  $definition = $entity_manager->getFieldStorageDefinitions('file')['myfield'];
  $entity_manager->onFieldStorageDefinitionCreate($definition);
6
Jonathan

これは既知の Drupal Coreの制限 準備が整っているように見えるので、D8.5で修正される予定です。それまでの間、問題にリンクされたパッチを適用できます。

1
AdamS

しますdrush field-delete myfieldname基本フィールドで機能しますか?その場合、drushのソースコードを調べて、drushがどのようにこれを実現するかを確認できます。

drush 8.xのドキュメント にこれに関する情報はありません。

0
LittleTiger