Jak programowo usunąć pole z węzła? Mam migrację, hook_update_N
która przenosi zawartość z pola do niestandardowej tabeli. Po tej migracji chcę usunąć pole w tej samej funkcji.
Czy są jakieś interfejsy API pól, które obsługują usuwanie pól?
Edycja, rozwiązanie : Ponieważ w odpowiedziach brakuje rzeczywistego kodu, oto co zrobiłem, aby przenieść pola od użytkowników $ do moich własnych rekordów, a następnie usunąć pole z bazy danych;
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
choćAby usunąć pole z określonego pakietu, którego możesz użyć
field_delete_instance()
Przykład:
Aby całkowicie usunąć pole z systemu, możesz użyć
field_delete_field()
Przykład:
Pola / instancje są zaznaczone tylko do usunięcia, dane zostaną faktycznie usunięte podczas kolejnych uruchomień crona. Aby wyczyścić ręcznie, wykonaj:
źródło
field_delete_field()
ifield_purge_batch()
pracy zapisuje wfield_config_instance
ifield_config
. Dlaczego?$instance = field_info_instance('node', 'field_name', 'page')
. Czy zamiast tego nie powinno być,$instance = field_info_instance('node', 'field_contact', 'job');
a następnie upuścić instrukcję if?if ( ($foo = $bar) ) {
Więc intencja jest oczywista, a potencjał z powodu błędu jest ograniczony. Sama instrukcja if jest konieczna, ponieważfield_delete_instance
nie sprawdza wartości nullAby odpowiedzieć na pytanie @berkes:
field_delete_field()
zaznacza pole do usunięcia, powodując jego oczyszczenie przy następnym uruchomieniu cron. Jednak to nie dane wyjeżdżać wfield_config_instance
odniesieniu do pola spadły. Uruchomienie crona lubfield_purge_batch()
nie usunie tych danych zfield_config_instance
tabeli, nawet jeśli dla usuniętej kolumny ustawiono1
pole.Dla mnie użycie,
field_delete_instance()
a następniefield_purge_batch()
dla każdego wyczyszczonego pola zadziałało - natychmiastowe usunięcie zarówno pola z bazy danych (bez konieczności użycia crona), jak i czyszczeniefield_config_instance
tabeli dowolnych danych pola (dla usuniętego pola).Oto rozwiązanie:
Zwróć uwagę na
TRUE
onfield_delete_instance()
, ponieważ oznacza to, że Field API powinien wykonywać operacje czyszczenia.źródło