drupal 7 – ¿Cómo eliminar programáticamente un campo de un nodo?

Pregunta:

¿Cómo se elimina un campo de un nodo mediante programación? Tengo una migración en hook_update_N que 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 se adapte a 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 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.
}

Respuesta:

field_delete_field($field_name) marcará $field_name para su eliminación en la próxima ejecución del cron.

Puede usar field_purge_batch para hacer la eliminación, si no desea hacerlo en cron run.

EDITAR: field_delete_field() debe usarse cuando también necesite eliminar el campo de otros paquetes. Si solo desea eliminar el campo de un paquete en particular, debe usar field_delete_instance() como lo menciona @Clive.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım