Иногда в Drupal возникает ситуация: вы удаляете поле с типов сущностей (bundle), но оно не исчезает полностью из системы. UI говорит, что поле «используется», хотя на самом деле ни одна сущность его не использует. В этом случае поле остаётся в конфигурации как FieldStorageConfig
.
Разберёмся, как удалить такое «висящее» поле.
Почему Drupal не удаляет поле полностью
В Drupal каждое поле состоит из двух частей, например field_content
:
- FieldStorageConfig — «хранилище» поля:
- Определяет тип поля, имя (
field_content
), базовые таблицы (node__field_content
,node_revision__field_content
). - Существует только одно на весь Drupal для данного типа сущности и имени поля.
- Определяет тип поля, имя (
- FieldConfig — привязка поля к конкретному типу сущности (bundle):
- Например,
node.article.field_content
илиnode.page.field_content
. - Если поле используется на нескольких bundle, каждая привязка хранится отдельно.
- Например,
Логика удаления:
- При удалении поля через UI или код удаляется FieldConfig (привязка к bundle).
- FieldStorageConfig удаляется только тогда, когда ни одна привязка больше не существует.
- Если конфигурация
field.storage.*
осталась, Drupal считает, что поле ещё может использоваться и блокирует полное удаление.
Как узнать, есть ли привязки к полю
После экспорта конфигурации (drush cex) можно выполнить поиск по имени поля в директории с файлами конфигурации.
1 |
grep -r "field_content" |
Если имя встречается только в одном файле — field.storage.node.field_content.yml, то есть в самой конфигурации поля, то значит, что поле не используется сущностями, можно его удалить.
Но Drupal иногда не делает этого, и тогда приходится выполняться операцию вручную.
Как удалить «висящее» поле полностью
Нужно выполнить php код:
1 2 3 4 5 6 7 |
$field_storage = \Drupal::entityTypeManager() ->getStorage('field_storage_config') ->load('node.field_content'); if ($field_storage) { $field_storage->delete(); } |
Это можно сделать прямо из консоли через drush, главное корректно экранировать спец. символы:
1 2 |
drush php-eval "\$field_storage = \Drupal::entityTypeManager()->getStorage('field_storage_config')->load('node.field_content'); if (\$field_storage) { \$field_storage->delete(); }" |
После этого:
- Таблицы
node__field_content
иnode_revision__field_content
будут удалены автоматически. - Поле полностью исчезнет из конфигурации Drupal.