Comment supprimer un champ d'un nœud par programme? J'ai une migration hook_update_N
qui déplace le contenu d'un champ dans une table personnalisée. Après cette migration, je souhaite supprimer le champ dans cette même fonction.
Existe-t-il des API de champ qui permettent de supprimer des champs?
Modifier, Solution : Parce que les réponses manquent de code réel, voici ce que j'ai fait pour déplacer les champs des utilisateurs $ dans mes propres enregistrements et supprimer ensuite le champ de la base de données;
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
cependantPour supprimer un champ d'un ensemble particulier, vous pouvez utiliser
field_delete_instance()
Exemple:
Pour supprimer complètement un champ du système, vous pouvez utiliser
field_delete_field()
Exemple:
Les champs / instances ne sont marqués que pour suppression, les données seront en fait purgées lors des cycles cron suivants. Pour le purger manuellement, exécutez:
la source
field_delete_field()
et lesfield_purge_batch()
travaux, il conserve les enregistrements dansfield_config_instance
etfield_config
. Pourquoi donc?$instance = field_info_instance('node', 'field_name', 'page')
. Ne devrait-il pas plutôt l'être$instance = field_info_instance('node', 'field_contact', 'job');
, puis supprimer l'instruction if?if ( ($foo = $bar) ) {
, l'intention est évidente et le potentiel pour l'erreur est limitée. L'instruction if elle-même est nécessaire carfield_delete_instance
ne vérifie pas nullPour répondre à la question @berkes:
field_delete_field()
marque le champ à supprimer, ce qui le purge lors de la prochaine exécution de cron. Cependant, il laisse des données surfield_config_instance
le champ supprimé. L'exécution de cron oufield_purge_batch()
ne supprimera pas ces données de lafield_config_instance
table, même si la colonne supprimée est définie sur1
pour le champ.Pour moi, utiliser
field_delete_instance()
suivi d'unfield_purge_batch()
pour chaque champ purgé travaillé - supprimer instantanément le champ de la base de données (sans nécessiter de cron), ainsi que purger lafield_config_instance
table de toutes les données de champ (pour le champ supprimé).Voici la solution:
Notez l'
TRUE
activationfield_delete_instance()
, car cela indique que l'API de champ doit effectuer des opérations de nettoyage.la source