Bagaimana cara menghapus bidang dari node secara terprogram? Saya memiliki migrasi hook_update_N
yang memindahkan konten dari bidang aa ke tabel kustom. Setelah migrasi itu, saya ingin menghapus bidang dalam fungsi yang sama.
Apakah ada API bidang yang melayani bidang penghapusan?
Sunting, Solusi : Karena jawaban tidak memiliki kode aktual, berikut adalah apa yang saya lakukan untuk memindahkan bidang dari $ users ke catatan saya sendiri dan kemudian menghapus bidang dari basis data;
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
meskipunUntuk menghapus bidang dari bundel tertentu yang dapat Anda gunakan
field_delete_instance()
Contoh:
Untuk menghapus bidang dari sistem sepenuhnya, Anda dapat menggunakan
field_delete_field()
Contoh:
Field / instance hanya ditandai untuk dihapus, data akan benar-benar dibersihkan selama cron run berikutnya. Untuk membersihkannya jalankan secara manual:
sumber
field_delete_field()
danfield_purge_batch()
bekerja, ia menyimpan catatan difield_config_instance
danfield_config
. Mengapa demikian?$instance = field_info_instance('node', 'field_name', 'page')
. Bukankah seharusnya sebaliknya$instance = field_info_instance('node', 'field_contact', 'job');
dan kemudian menjatuhkan pernyataan if?if ( ($foo = $bar) ) {
Jadi niatnya jelas dan potensi untuk kesalahan terbatas Pernyataan if itu sendiri diperlukan karenafield_delete_instance
tidak memeriksa nullUntuk menjawab pertanyaan @berkes:
field_delete_field()
tidak menandai bidang untuk dihapus, menyebabkannya dibersihkan pada cron run berikutnya. Namun itu tidak meninggalkan datafield_config_instance
tentang bidang yang dijatuhkan. Menjalankan cron ataufield_purge_batch()
tidak akan menghapus data ini darifield_config_instance
tabel, bahkan jika kolom yang dihapus diatur ke1
untuk bidang tersebut.Bagi saya menggunakan
field_delete_instance()
diikuti olehfield_purge_batch()
untuk setiap bidang dibersihkan bekerja - langsung menghapus kedua bidang dari basis data (tanpa memerlukan cron), serta membersihkanfield_config_instance
tabel data bidang apa pun (untuk bidang yang dihapus).Ini solusinya:
Perhatikan
TRUE
padafield_delete_instance()
, karena menunjukkan bahwa API Lapangan harus melakukan operasi pembersihan.sumber