Como se remove um campo de um nó programaticamente? Eu tenho uma migração hook_update_N
que move o conteúdo de um campo para uma tabela personalizada. Após essa migração, desejo remover o campo nessa mesma função.
Existem APIs de campo que servem para remover campos?
Editar, Solução : Como as respostas não possuem código real, eis o que fiz para mover os campos dos $ users para os meus próprios registros e, posteriormente, remover o campo do banco de dados;
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
emboraPara remover um campo de um pacote específico, você pode usar
field_delete_instance()
Exemplo:
Para remover completamente um campo do sistema, você pode usar
field_delete_field()
Exemplo:
Os campos / instâncias são marcados apenas para exclusão, os dados serão realmente eliminados durante as execuções cron subsequentes. Para removê-lo manualmente, execute:
fonte
field_delete_field()
efield_purge_batch()
trabalha, mantém registros emfield_config_instance
efield_config
. Por que é que?$instance = field_info_instance('node', 'field_name', 'page')
. Em vez disso, não deveria ser$instance = field_info_instance('node', 'field_contact', 'job');
e depois soltar a instrução if?if ( ($foo = $bar) ) {
para que a intenção seja óbvia e o potencial o erro é limitado A instrução if em si é necessária porquefield_delete_instance
não verifica nuloPara responder à pergunta @berkes:
field_delete_field()
marca o campo para exclusão, fazendo com que seja eliminado na próxima execução do cron. No entanto , deixa dadosfield_config_instance
sobre o campo eliminado. A execução do cron oufield_purge_batch()
não removerá esses dados dafield_config_instance
tabela, mesmo se a coluna excluída estiver configurada como1
para o campo.Para mim, usei
field_delete_instance()
seguido por umfield_purge_batch()
para cada campo eliminado funcionou - removendo instantaneamente o campo do banco de dados (sem a necessidade de cron), além de limpar ofield_config_instance
tabela de qualquer dado do campo (para o campo excluído).Aqui está a solução:
Observe o que está
TRUE
ativadofield_delete_instance()
, pois indica que a API do campo deve executar operações de limpeza.fonte