Qual é a maneira correta de excluir programaticamente uma entrada de campo específica para um campo com várias entradas de uma entidade específica? (são campos e entidades específicos, não tipos de campo ou instâncias e tipos de entidade)
Aqui estão algumas possibilidades que examinei e que não funcionam:
- Carregando a entidade com
entity_load()
, definindo a entrada do campo como = null ou = array () e salvando comfield_attach_update()
. É o mais próximo que eu encontrei, mas deixa uma entrada de campo nulo zumbi no banco de dados que aparece como uma linha em branco nos formulários até que o formulário seja salvo ehook_field_is_empty()
possa entrar em ação (hook_field_is_empty()
é configurado de forma que = null ou = array () sinalize vazio). - Carregando a entidade
entity_load()
, desmarcando a entrada do campo por chave e salvando comfield_attach_update()
. Isso parece não fazer nada - parece que o Drupal interpreta a entrada não estando lá como um sinal para não modificá-la. (estranhamente, às vezes também recebo o tempo limite de expiração do tempo máximo de consulta ao tentar esta abordagem) field_attach_delete()
- isso é muito franco: mata todos os campos da entidadefield_purge_data()
- melhor, mas ainda muito franco: mata todas as entradas do campo, não entradas específicas
Então, para esclarecer, eu tenho um código que encontra (e carrega) uma entidade que possui um campo que possui várias entradas e que encontra uma entrada específica nesse campo que precisa ser removida. Desejo remover completamente essa entrada, sem tocar em nenhuma outra entrada ou em qualquer outro campo da entidade.
Eu precisava fazer isso como parte de uma limpeza de migração do Drupal8.
Após algumas experiências, descobri que a iteração e o uso de unset () no delta poderiam matá-lo. Meu exemplo foi remover uma tag (portanto, procuro por 'target_id', não 'value', como você costuma fazer em outros campos.
E depois, se o sucesso, então
$object->save();
fonte
Para o Drupal 8, para excluir um campo de uma entidade:
Isso chamará o método mágico __unset () de ContentEntityBase:
Não esqueça que, para manter suas alterações, você precisa ligar para
Depois de fazer todas as suas alterações.
fonte
Esta é a melhor maneira:
fonte
o método preferido atual empregaria o entity_metadata_wrapper
este é o melhor tutorial sobre a EMW que eu já vi http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal
fonte