Как полностью удалить поле в Drupal, если оно «зависло» в хранилище полей

Иногда в Drupal возникает ситуация: вы удаляете поле с типов сущностей (bundle), но оно не исчезает полностью из системы. UI говорит, что поле «используется», хотя на самом деле ни одна сущность его не использует. В этом случае поле остаётся в конфигурации как FieldStorageConfig.

Разберёмся, как удалить такое «висящее» поле.

Почему Drupal не удаляет поле полностью

В Drupal каждое поле состоит из двух частей, например field_content:

  1. FieldStorageConfig — «хранилище» поля:
    • Определяет тип поля, имя (field_content), базовые таблицы (node__field_content, node_revision__field_content).
    • Существует только одно на весь Drupal для данного типа сущности и имени поля.
  2. FieldConfig — привязка поля к конкретному типу сущности (bundle):
    • Например, node.article.field_content или node.page.field_content.
    • Если поле используется на нескольких bundle, каждая привязка хранится отдельно.

Логика удаления:

  • При удалении поля через UI или код удаляется FieldConfig (привязка к bundle).
  • FieldStorageConfig удаляется только тогда, когда ни одна привязка больше не существует.
  • Если конфигурация field.storage.* осталась, Drupal считает, что поле ещё может использоваться и блокирует полное удаление.

Как узнать, есть ли привязки к полю

После экспорта конфигурации (drush cex) можно выполнить поиск по имени поля в директории с файлами конфигурации.

Если имя встречается только в одном файле — field.storage.node.field_content.yml, то есть в самой конфигурации поля, то значит, что поле не используется сущностями, можно его удалить.

Но Drupal иногда не делает этого, и тогда приходится выполняться операцию вручную.

Как удалить «висящее» поле полностью

Нужно выполнить php код:

Это можно сделать прямо из консоли через drush, главное корректно экранировать спец. символы:

После этого:

  • Таблицы node__field_content и node_revision__field_content будут удалены автоматически.
  • Поле полностью исчезнет из конфигурации Drupal.

Мало букафф? Читайте есчо !

Загрузить данные параграфов для связанного с ними entity

Июль 8, 2023 г.

Пример кода для загрузки параграфов. В данном примере будем загружать параграфы, связанные с entity commerce_product_variation (это сущность модуля Commerce). Я привязал информацию по остаткам складов к вариациям в виде параграфов (тип - stocks). ...

Читать

Модификация тела письма перед отправкой в Drupal

Июнь 9, 2023 г.

Рассмотрим два варианта, как зацепиться к отправляемым письмам и внести туда свои изменения. Первый вариант заключается в прямом изменении тела письма перед отправкой. Для этого мы реализуем hook_mail_alter(&message). MAIL ALTER хук Переменная ...

Читать

Использование entityqueue для сортировки элементов во view, основанной на Search API datasource

Апрель 3, 2024 г.

Ранее подход, который я опишу, использовался для nodequeue, сейчас с заменой плагина фунционалом entityqueue, тоже самое можно применить и для него. Проблема: Создано представление (view), где источник данных - элементы datasource Search API. ...

Читать

Транслитерация имени файла при создании медиа entity программно в Drupal

Май 21, 2023 г.

При импорте изображений возникает задача транслитерации. Картинки, например, могут содержать буквы национальной кодировки (кириллицы) и/или иметь несовместимые с файловой системой сервера символы. Drupal (начиная с 8.2) объявляет специальный интерфейс, ...

Читать
 

Комментарии к «Как полностью удалить поле в Drupal, если оно «зависло» в хранилище полей»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: