Apresenta um problema de fluxo de trabalho com a exclusão de um campo


14

Suponha que eu tenho um tipo de conteúdo Personcom campos: Name, Age,Email

Esse tipo de conteúdo é controlado por um recurso chamado testpara que eu possa controlá-lo na origem e enviá-lo ao site ativo.

Meu fluxo de trabalho é assim:

  • Eu adiciono um novo campo no PersonchamadoPhone
  • localmente eu faço: drush fu test -y
  • Eu edito o test.infopara aumentar o número da versão
  • Eu comprometo as alterações no meu repositório
  • Envio o recurso para o site ativo (copie os arquivos dos recursos)
  • no site ao vivo eu faço: drush fr test -y
  • no site ao vivo eu faço: drush cc all

Em seguida, o novo campo aparece no site ativo Person.

Se, na primeira etapa, remover um campo, Persono campo não será excluído do site ativo. Como eu resolvo isso? Não quero excluí-lo manualmente da interface do usuário no site ativo.
Esse fluxo de trabalho está correto?


1
Use Drush teste fu -y --version-incremento para automaticamente incrementar o número da versão
Mike

Respostas:


9

Esta é uma faca de dois gumes, é assim para impedir a exclusão de dados, o que é sempre uma coisa boa. Não há realmente nada a resolver, este é um comportamento esperado.

É o mesmo fluxo de trabalho que usamos e trabalha há mais de um ano e funciona muito bem. Eu diria que está correto, mas essa é uma resposta muito subjetiva.


E se eu realmente quisesse excluir o campo? Devo procurar ganchos de atualização? (Eu sou um novato em D7).
cherouvim

3
Ganchos de atualização seriam ideais ou remova-os manualmente.
digital de

2
OK, eu também poderia fazerdrush field-delete field
cherouvim 06/04/12

@cherouvim Então você teria que fazer isso toda vez que recriar um recurso?
AlxVallejo

Um hook_update_N () no arquivo .install do recurso funcionaria.
Mike

10

A maneira correta de remover o conteúdo criado pelos Recursos é através do hook_update_N (que deve ser implementado no arquivo your_module.install).


A principal idéia dos Recursos é gerenciar a configuração com o código. O uso hook_update_Né consistente com isso, já que a exclusão do campo está no código (que pode ser gerenciado com controle de versão) - enquanto o comando equivalente drush field-delete fieldnão está sendo chamado do código gerenciado; é uma etapa separada da linha de comando que você precisa executar (e lembre-se de executar).


Por quê? Não vai drush field-delete fieldfuncionar bem?
cherouvim

5
Claro, isso funcionaria e pode ser uma solução mais simples. Mas a principal idéia dos Recursos é gerenciar a configuração com código. O uso hook_update()é consistente com isso, pois a exclusão do campo está no código (que pode ser gerenciado com controle de versão) - enquanto o comando drush não está sendo chamado a partir do código gerenciado; é uma etapa separada da linha de comando que você precisa executar (e lembre-se de executar).
smokris

Em qual arquivo de um recurso usarei hook_update ()? hook_update () usa um objeto de nó como parâmetro, portanto, não é possível fornecer um objeto de nó enquanto habilita o recurso.
21118 Sub

@ subhojit777: Ops, vinculei à página de documentação do gancho errado. Eu apenas consertei o link; consulte os documentos para hook_update_N.
smokris

@smokris :) eu mencionei esse gancho na minha resposta
subhojit777

2

Crie um novo arquivo chamado "your_feature_name.install"

Dentro do arquivo declarar hook_update_N , é possível usar field_delete_field () e especificar o nome do campo que você deseja excluir como parâmetro.

Execute update.php e os campos serão excluídos.


0

Se você estiver usando field_phoneem outras áreas, convém removê-lo do seu tipo de conteúdo de Pessoa, mas não excluí-lo totalmente do seu site. Crie manualmente um YOUR_FEATURE_NAME.installarquivo na pasta do seu recurso, da seguinte maneira:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Se você estava excluindo isso de um parágrafo de pessoa em vez de um tipo de conteúdo de pessoa, poderia alterar a primeira declaração condicional para algo como isto:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.