私のモジュールは、ベースフィールド「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);
これは既知の Drupal Coreの制限 準備が整っているように見えるので、D8.5で修正される予定です。それまでの間、問題にリンクされたパッチを適用できます。
しますdrush field-delete myfieldname
基本フィールドで機能しますか?その場合、drushのソースコードを調べて、drushがどのようにこれを実現するかを確認できます。
drush 8.xのドキュメント にこれに関する情報はありません。