Criei um tipo de conteúdo que possui um campo de opção de lista / seleção e inseri os pares de chave | valor conforme necessário para que a lista de seleção funcione.
Os dados foram inseridos e foi decidido que certos termos não se aplicam mais e que eles devem ser excluídos.
No entanto, ao tentar remover os termos mencionados, recebo o seguinte erro:
Allowed values list: some values are being removed while currently in use.
Obviamente, na vida de um projeto, os valores vão mudar. Qual é a maneira prática de remover itens depois que os nós são associados aos termos listados?
Essa é a coisa mais próxima que eu pude encontrar:
https://drupal.org/node/1653012
Ele faz referência a um plugin d6 e alguns truques de patch que eu preferiria não ter que recorrer. Se eu tivesse que finalmente usar o patch para remover a verificação de validação nesse campo, há algum mal em deixar esses itens órfãos nos nós aos quais eles estavam associados?
Atualização, deparei-me com esse problema novamente com um cliente do governo que, nos últimos 7 anos com um site do Drupal, teve 50 estados e territórios em uma lista de seleção. Agora, a política mudou e os territórios não precisam mais ser incluídos. Ser capaz de remover itens das listas de seleção é importante e, portanto, estou oferecendo uma recompensa.
Estou procurando uma solução segura para poder remover itens de uma lista de seleção. O que eu não sei é se essa solução deve atualizar qualquer um dos nós, pois não tenho certeza de como os valores do campo são armazenados em relação ao conteúdo total de um nó.
Estou feliz com uma solução SQL pura para executar no MySQL; ou, estou procurando um módulo.
Respostas:
Eu fiz algo assim recentemente com a seguinte abordagem.
por exemplo:
Dessa maneira, os dados herdados são preservados para referência, o formulário é validado e a integridade dos dados permanece intacta.
fonte
Como eu sei, todos os dados dos campos são armazenados em 2 tabelas: field_data_field_FIELDNAME e field_revision_field_FIELDNAME. E encontrei a confirmação do meu pensamento aqui: /programming//a/7773117/1300562
Portanto, para remover valores de campo desnecessários, você deve excluir esses valores das tabelas mencionadas acima e removê-los da lista de valores permitidos.
Passo 1.
Etapa 2.
Remova os pares desnecessários de valor da chave na página de configurações de campo e envie o formulário para salvar as alterações.
O cache deve ser limpo automaticamente depois disso, mas se você ainda conseguir ver os valores de campo removidos nas páginas do nó, limpe o cache manualmente.
PS: Recentemente, enfrentei um problema semelhante, e agora prefiro usar campos do tipo "Referência de termo" ou (melhor ainda) "Referência de entidade" em vez de lista de valores de texto. Ao usar o campo de referência, você pode criar vocabulário separado para cada campo e simplesmente criar / editar / excluir termos a qualquer momento.
fonte
Antes de mais nada, verifique se você tem algum valor permitido especificado no campo? Se o fizer, uma outra opção não será validada. Portanto, tente remover os valores da guia Configurações do campo primeiro.
Alternativamente, você tem 2 opções:
1
Remova todos os valores que você colocou na lista de valores permitidos que estão em uso pelas contas de usuário. Por exemplo, você pode executar uma consulta SQL para encontrar estes:
ou crie uma visualização do usuário que mostre quais contas de usuário têm o valor que você deseja remover da lista de valores permitidos.
2)
Se você não deseja remover valores dos campos, isso pode ser alcançado através do hack.
Atenção, essa não é uma solução sugerida para produção e você deve saber o que está fazendo!
Encontre a função field_has_data () e adicione
return TRUE;
a primeira linha da função.fonte
Eu acho que você realmente pode fazer isso usando o módulo Views Bulk Operations .
fonte
Aí vem uma melhoria para a resposta HL, que eu acho que é a melhor:
Para resumir, você precisa atribuir novos valores ao conteúdo que possui valores "antigos" atribuídos ao seu campo de seleção.
Além do Views Bulk Operations , você precisará instalar e ativar o módulo Views de Administração . Com este módulo, você já tem uma visualização pronta para uso com operações em massa ativadas (basta ver admin / conteúdo uma vez ativado). Então:
1) Vá para admin / structure / views e edite a visualização "Administração: Nó"
2) Adicione uma nova página para a visualização usando o botão "Adicionar -> Página" na parte superior
3) Atribua um caminho para a nova exibição: Exemplo admin / content / custom
4) Adicione um novo filtro ao seu campo de seleção: Selecione o operador "é um dos" e selecione todas as opções que deseja excluir
5) Salve a vista
6) Vá para admin / content / custom Agora você vê todo o conteúdo que precisa editar em massa (altere o valor para o campo de seleção)
7) Selecione todas as linhas clicando na primeira caixa de seleção à esquerda da tabela (se houver mais de uma página, selecione também um botão que diz "Selecionar todas as X linhas nesta exibição")
8) Selecione a operação "alterar valor" e pressione "Executar"
9) Para o seu campo de seleção, selecione um novo valor para substituir os que você deseja excluir
10) Marque a caixa de seleção para esse campo de seleção
11) Clique em Avançar e pronto
fonte
Parece que o problema do Drupal se baseia em um problema de dados mais profundo: o que acontece com as entidades que estão usando os valores de lista depreciados no momento? Esta pergunta está na raiz da mensagem de erro que o Drupal está lhe enviando.
Vamos dar uma olhada no seu exemplo de estado / território. Seu cliente usa um sistema que trata estados e territórios da mesma maneira há anos e construiu um enorme grupo de nós que contêm estados e territórios. Então, um dia, os poderes que decidem que os territórios precisam ser tratados de maneira diferente e que o menu suspenso para atribuir a região não deve mais conter territórios. Ótimo. Simplesmente crie uma exibição que use filtros padrão para renderizar uma lista de todos os nós do território e use o Views Bulk Operations para alterar todos os valores de suas regiões para ... o que ... um 51º estado chamou outro talvez? O destino dos territórios é uma questão muito séria. Sua solução deve incluir um método para preservar ou realocar o status do território. Pode ser necessário criar um novo campo de lista chamado 'Território'
Você precisará usar regras com Exibir operações em massa para executar essas alterações. Se você não sabe muito sobre regras, reserve um tempo para aprender sobre como elas funcionam. Rules fornece a capacidade de manipular informações com base em gatilhos, condições e ações. Depois de aprender sobre as regras, você pode descobrir que as respostas que procura estão apresentando-se intuitivamente. Basicamente, você precisará criar uma regra, que é acionada por uma operação em massa, que terá como alvo todos os territórios e removerá, reatribuirá, renomeará ou de outra forma os separará do corpo principal de informações. A Regra deve ser capaz de armazenar o estado do território de alguma forma e, ao mesmo tempo, definir o status suspenso para o status 'outro' ou 'N / D'. Isso pode ser tudo o que é necessário. De outra forma...
Após a reatribuição, deve ser uma operação simples alterar o campo da lista original e remover os nomes dos territórios. No entanto, se o sistema ainda não permitir que você altere a lista, talvez seja necessário criar um novo campo de lista e use as Regras e Operação em Massa de Exibições para revisar todos os valores de estado atuais e reatribuí-los à nova lista. As regras podem trabalhar com o Views Bulk Operations para direcionar todos os nós relevantes e agir sobre eles com base nos valores do campo. É fácil definir o valor de um novo campo de lista com base no valor de um campo de lista existente para um grupo de nós quando você usa Regras.
Lembre-se também de que, se o Drupal apresentar problemas com uma operação, sempre lave o cache antes de considerar uma alternativa difícil.
fonte
Suponho que seu cliente deseja que o conteúdo herdado mantenha seu valor original, o que significa que alterar a lista de seleção destruirá efetivamente quaisquer dados anteriores. Se isso não for uma preocupação, provavelmente qualquer uma das outras respostas funcionaria. Se for esse o caso, você não poderá realmente alterar a lista de seleção sem perder esse histórico de dados. Eu poderia seguir uma rota muito mais simples, para permitir dados históricos, enquanto tornava o site um pouco mais à prova de futuro - eu sugeriria o uso de permissões de campo:
* configure um novo campo para essa lista de seleção usando uma taxonomia em vez de dados estáticos
* defina a permissão de campo para a lista de seleção existente como VIEW, mas não EDIT por ninguém, exceto admin
Com isso, o campo antigo deve permanecer visível e pesquisável (adicione um novo título refletindo-o apenas como legado), mas não editável. É claro que isso depende muito de pesquisas personalizadas, visualizações etc. que talvez precisem ser ajustadas.
Eu sugiro isso (por mais confuso que possa parecer) porque a remoção desses dados remove o histórico e isso pode acabar sendo devastador a longo prazo. Você pode até usar css para ocultar o campo antigo no nó de edição e um gancho para ocultá-lo para o novo conteúdo (onde ele não tem um valor definido). Dessa forma, seria exibido apenas para esse conteúdo herdado.
Obviamente, você poderia dar um passo adiante com um módulo único personalizado para copiar os dados da lista de seleção antiga para a nova taxonomia.
fonte
Um script drush simples para o resgate! Atualizamos os dados dos campos e as tabelas de revisão de campos e substituímos os valores antigos pelos novos antes de alterar manualmente as configurações do campo.
Se tivermos algo assim em nossas configurações de campo atuais:
e deseja substituí-lo pelo seguinte:
Primeiro, executamos o script drush e, em seguida, alteramos as configurações de campo na UI do administrador.
Nota: Este código é para um campo com o nome da máquina
field_foo_bar
.fonte
Usei a segunda sugestão de kenorb e ela trabalhou para atualizar a lista de valores em um campo Drupal 7.52, Profile2 7.x-1.3. Portanto, se você recebeu o aviso drupal: “Lista de valores permitidos: alguns valores estão sendo removidos enquanto estão em uso no momento.” O seguinte me permitiu remover valores do campo (profile2), sem removê-los ou substituí-los no banco de dados.
No diretório raiz do núcleo do Drupal, há uma pasta chamada modules, e o arquivo a ser editado está localizado em: modules / field / field.module. ESTE É UM ARQUIVO NÚCLEO, você deve absolutamente reverter suas alterações quando terminar de atualizar os valores. Coloquei o site offline, substituí temporariamente o seguinte bloco de código em (drupal root) /modules/field/field.module
COM EXATAMENTE
E o drupal parou de reclamar e eu pude alterar a lista. (No meu caso, é o corpo docente na lista de valores que deixaram a universidade, mas ainda estão associados a um registro de alunos, como orientador, mentor etc.)
fonte