¿Cómo se elimina un campo de un nodo mediante programación? Tengo una migración hook_update_Nque mueve el contenido de un campo a una tabla personalizada. Después de esa migración, quiero eliminar el campo en esa misma función.
¿Hay alguna API de campo que atienda la eliminación de campos?
Editar, Solución : Debido a que las respuestas carecen de código real, esto es lo que hice para mover los campos de $ users a mis propios registros y, posteriormente, eliminar el campo de la base de datos;
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_batchembargoPara eliminar un campo de un paquete particular, puede usar
field_delete_instance()Ejemplo:
Para eliminar un campo del sistema por completo, puede usar
field_delete_field()Ejemplo:
Los campos / instancias solo están marcados para su eliminación, los datos se eliminarán en las ejecuciones cron posteriores. Para purgarlo, ejecute manualmente:
fuente
field_delete_field()yfield_purge_batch()funciona, mantiene registrosfield_config_instanceyfield_config. ¿Porqué es eso?$instance = field_info_instance('node', 'field_name', 'page'). ¿No debería ser así$instance = field_info_instance('node', 'field_contact', 'job');y luego descartar la instrucción if?if ( ($foo = $bar) ) {la intención es obvia y el potencial el error es limitado. La declaración if en sí misma es necesaria porquefield_delete_instanceno verifica nuloPara responder a la pregunta de @berkes:
field_delete_field()marca el campo para su eliminación, lo que hace que se purgue en la próxima ejecución cron. Sin embargo, deja datosfield_config_instancesobre el campo descartado. Ejecutar cron ofield_purge_batch()no eliminará estos datos de lafield_config_instancetabla, incluso si la columna eliminada está configurada1para el campo.Para mí, el uso
field_delete_instance()seguido de unfield_purge_batch()para cada campo purgado funcionó: eliminar instantáneamente tanto el campo de la base de datos (sin requerir cron), como también purgar lafield_config_instancetabla de cualquier dato de campo (para el campo eliminado).Aquí está la solución:
Tenga
TRUEen cuenta el encendidofield_delete_instance(), ya que indica que la API de campo debe realizar operaciones de limpieza.fuente