Как программно удалить поле из узла? У меня есть миграция, hook_update_N
которая перемещает содержимое из поля в пользовательскую таблицу. После этой миграции я хочу удалить поле в той же функции.
Есть ли какие-либо API полей, которые обслуживают удаление полей?
Редактирование, решение : поскольку в ответах отсутствует фактический код, я сделал это, чтобы переместить поля из $ users в мои собственные записи и впоследствии удалить это поле из базы данных;
function my_module_update_7005(&$sandbox) {
$slice = 100;
//Fetch users from database;
if (!isset($sandbox['progress'])) {
$sandbox['progress'] = 0;
$sandbox['current_uid'] = 0;
// We'll -1 to disregard the uid 0...
$sandbox['max'] = db_query('SELECT COUNT(DISTINCT uid) FROM {users}')->fetchField() - 1;
}
if (empty($users)) {
$sandbox["current_uid"] += $slice;
}
$users = db_select('users', 'u')
->fields('u', array('uid', 'name'))
->condition('uid', $sandbox['current_uid'], '>')
->range(0, $slice)
->orderBy('uid', 'ASC')
->execute();
//Loop trough users;
foreach ($users as $user) {
$foo = new Foo();
// Warning: drupal's fields return mixed values; e.g. NULL versus an int.
$foo->debits = (int) $user->user()->field_credits["und"][0]["value"];
$foo->save();
$sandbox['progress']++;
$sandbox['current_uid'] = $user->uid;
}
$sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
// Remove the field.
field_delete_field("field_credits"); //note that the name for Foo is field_foo
field_purge_batch($sandbox['max']+1);//Drupal seems to have an offbyone problem.
}
field_purge_batch
хотяЧтобы удалить поле из определенного пакета, вы можете использовать
field_delete_instance()
Пример:
Чтобы полностью удалить поле из системы, вы можете использовать
field_delete_field()
Пример:
Поля / экземпляры помечаются только для удаления, данные будут фактически очищены во время последующих запусков cron. Для очистки вручную выполните:
источник
field_delete_field()
иfield_purge_batch()
работы хранит записи вfield_config_instance
иfield_config
. Это почему?$instance = field_info_instance('node', 'field_name', 'page')
. Разве это не должно быть,$instance = field_info_instance('node', 'field_contact', 'job');
а затем отбросить оператор if?if ( ($foo = $bar) ) {
чтобы намерение было очевидным и потенциальным для ошибки ограничено. Сам оператор if необходим, потомуfield_delete_instance
что не проверяет наЧтобы ответить на вопрос @berkes:
field_delete_field()
помечает поле для удаления, в результате чего оно очищается при следующем запуске cron. Однако он оставляет данныеfield_config_instance
о пропущенном поле. Запустив cron илиfield_purge_batch()
не удалит эти данные изfield_config_instance
таблицы, даже если для удаленного столбца установлено значение1
для поля.Для меня использование с
field_delete_instance()
последующим afield_purge_batch()
для каждого очищенного поля сработало - мгновенное удаление как поля из базы данных (не требуя cron), так и очисткаfield_config_instance
таблицы от любых данных поля (для удаленного поля).Вот решение:
Обратите внимание на
TRUE
onfield_delete_instance()
, так как это означает, что Field API должен выполнять операции очистки.источник