Wie entfernt man ein Feld programmgesteuert von einem Knoten? Ich habe eine Migration hook_update_N
, die den Inhalt von einem Feld in eine benutzerdefinierte Tabelle verschiebt. Nach dieser Migration möchte ich das Feld in derselben Funktion entfernen.
Gibt es Feld-APIs, die das Entfernen von Feldern ermöglichen?
Bearbeiten, Lösung : Da den Antworten aktueller Code fehlt, habe ich die Felder aus den $ -Nutzern in meine eigenen Datensätze verschoben und sie anschließend aus der Datenbank entfernt.
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
obwohlUm ein Feld aus einem bestimmten Bündel zu entfernen, können Sie verwenden
field_delete_instance()
Beispiel:
Um ein Feld vollständig aus dem System zu entfernen, können Sie verwenden
field_delete_field()
Beispiel:
Die Felder / Instanzen sind nur zum Löschen markiert, die Daten werden bei nachfolgenden Cron-Läufen tatsächlich gelöscht. So löschen Sie es manuell:
quelle
field_delete_field()
und derfield_purge_batch()
Arbeit werden Aufzeichnungen infield_config_instance
und geführtfield_config
. Warum das?$instance = field_info_instance('node', 'field_name', 'page')
. Sollte es nicht stattdessen sein$instance = field_info_instance('node', 'field_contact', 'job');
und dann die if-Anweisung fallen lassen?if ( ($foo = $bar) ) {
die Absicht offensichtlich und das Potenzial) Die if-Anweisung selbst ist notwendig, weilfield_delete_instance
nicht auf null geprüft wirdUm @berkes Frage zu beantworten:
field_delete_field()
markiert das Feld zum Löschen und löscht es beim nächsten Cron-Lauf. Allerdings macht es leave Daten überfield_config_instance
das abgelegte Feld über.field_purge_batch()
Wird cron ausgeführt oder werden diese Daten nicht aus derfield_config_instance
Tabelle entfernt, auch wenn die gelöschte Spalte1
für das Feld auf gesetzt ist.Für mich hat das Verwenden von
field_delete_instance()
gefolgt von einemfield_purge_batch()
für jedes gelöschte Feld funktioniert - sowohl das Entfernen des Felds aus der Datenbank (ohne dass ein Cron erforderlich ist) als auchfield_config_instance
das Löschen der Tabelle mit Felddaten (für das gelöschte Feld).Hier ist die Lösung:
Sie beachten Sie die
TRUE
auffield_delete_instance()
, da es zeigt , dass das Feld API Bereinigungen durchzuführen , sollte.quelle