Лучший способ удалить поле из типа контента

21

Каков наилучший способ удалить поле Drupal 7 из типа контента, определенного через графический интерфейс? Я хочу использовать hook_update_N, чтобы изменения могли распространяться на несколько серверов при запуске update.php. Однако я не могу найти решение. db_drop_table () будет иметь смысл для пользовательских схем, но не для типа / поля содержимого, определенного через графический интерфейс.

любитель бариста
источник
Вы создали пользовательский модуль для определения типа контента?
iStryker
iStryker: создал тип контента через интерфейс администратора, добавил несколько полей, затем экспортировал через Feature. Но теперь я хочу удалить одно из этих полей программно.
бариста-любитель
Отмечено, что D5 предоставляет функцию content_field_instance_delete () , описанную здесь и здесь , но эта функция недоступна для D7. Также любопытно, что field.install в ядре D7 использует для удаления полей: _update_7000_field_delete_instance () - пользовательская «внутренняя» функция, недоступная для использования другими. Для чего-то такого важного, как поля, мне кажется, что где-то должна быть доступна «публичная» функция, и это то, что я ищу.
бариста-любитель
В настоящее время моей публичной функцией-кандидатом является field_delete_instance ().
бариста-любитель

Ответы:

18

Есть две функции API для удаления полей:

  • field_delete_field Удалить все поле (все экземпляры поля)
  • field_delete_instance Чтобы удалить только экземпляр поля - то есть, как он прикреплен к объекту.

Если вы не хотите повторно использовать поле, может быть, будет немного чище удалить все поле, а не удалять только его экземпляр в рассматриваемом типе содержимого. Только ты можешь быть судьей этого.

googletorp
источник
2
Работал как шарм. Функция не возвращает никаких аргументов, поэтому при использовании в сочетании с hook_update_N () я бы порекомендовал сделать watchdog () для регистрации изменений вашего обновления.
бариста-любитель
9

Да, field_delete_instance () - это функция для удаления экземпляров полей.

Обратите внимание, что field_delete_instance()автоматические вызовы, field_delete_field()если нет оставшихся экземпляров, так field_delete_instance()что, скорее всего, все, что вам когда-либо понадобится.

_update_7000_field_delete_instance()предназначен для основных функций обновления. Пример: в функции обновления x_update_7000()вы используете field_delete_instance(). Затем x_update_7001()вы изменяете {field_config}таблицу противоречивым образом и, field_delete_instance()очевидно, также должны быть изменены.

Но теперь x_update_7000()вызов to field_delete_instance()приведет к ошибке, потому что таблица все еще в старой структуре. Однако ситуация для добавленных модулей отличается, так как они всегда должны выполняться после всех обновлений ядра и, следовательно, должны работать с самой последней версией ядра.

Но это шаблон, который вы можете использовать для своих собственных функций API, которые вы используете в функциях обновления.

Кроме того, эти функции _update не выполняют ловушки, потому что результат непредсказуем (например, потому что модуль, для которого выполняется обновление, может быть отключен).

Berdir
источник