Melhor maneira de eliminar um campo de um tipo de conteúdo

21

Qual é a melhor maneira de remover um campo do Drupal 7 de um tipo de conteúdo definido por meio da GUI? Eu quero usar hook_update_N para que as alterações possam ser propagadas para vários servidores após a execução do update.php. No entanto, não consigo encontrar uma solução. db_drop_table () faria sentido para mim para esquemas definidos personalizados, mas não para um tipo / campo de conteúdo definido por meio da GUI.

barista amador
fonte
você criou um módulo personalizado para definir um tipo de conteúdo?
IStryker
iStryker: criou o tipo de conteúdo por meio da interface administrativa, adicionou alguns campos e depois exportou por meio do recurso. Mas agora eu quero remover um desses campos programaticamente.
amateur barista
Observou que o D5 fornece uma função content_field_instance_delete () , documentada aqui e aqui , mas essa função não está disponível para o D7. Também é curioso o uso de field.install no núcleo D7 para excluir um campo: _update_7000_field_delete_instance () - uma função "interna" personalizada que não está disponível para uso de outras pessoas. Para algo tão importante quanto os campos, parece-me que deve haver uma função "pública" disponível em algum lugar, e é isso que estou procurando.
amateur barista
Atualmente, minha função pública "candidato" é field_delete_instance ().
amateur barista

Respostas:

18

Existem duas funções da API para excluir campos:

  • field_delete_field Para excluir o campo inteiro (todas as instâncias do campo)
  • field_delete_instance Para excluir apenas uma instância de um campo - é assim que ele é anexado a uma entidade.

Se você não deseja reutilizar o campo, pode ser um pouco mais limpo excluir o campo inteiro em vez de excluir apenas a instância dele no tipo de conteúdo em questão. Somente você pode ser o juiz disso.

googletorp
fonte
2
Funcionou como um encanto. A função não retorna nenhum argumento; portanto, ao usar em combinação com um hook_update_N (), eu recomendaria fazer um watchdog () para registrar suas alterações de atualização.
amateur barista
9

Sim, field_delete_instance () é a função para excluir instâncias de campo.

Observe que field_delete_instance()chama automaticamente field_delete_field()se não houver instâncias remanescentes; portanto, field_delete_instance()é provavelmente tudo o que você precisará.

_update_7000_field_delete_instance()foi projetado para as principais funções de atualização. Exemplo: na função de atualização x_update_7000(), você está usando field_delete_instance(). Então x_update_7001(), você muda a {field_config}tabela de uma maneira inconsistente e field_delete_instance()obviamente também precisa ser alterada.

Mas x_update_7000()a chamada de agora field_delete_instance()resultaria em um erro porque a tabela ainda está na estrutura antiga. No entanto, a situação dos módulos contribuídos é diferente, pois eles sempre devem ser executados após todas as atualizações principais e, portanto, precisam trabalhar com a versão principal mais recente.

Mas, esse é um padrão que você pode querer usar para suas próprias funções de API que você está usando nas funções de atualização.

Além disso, essas funções _update não executam ganchos porque o resultado não é previsível (por exemplo, porque o módulo para o qual a atualização é executada pode estar desativado).

Berdir
fonte