Como altero o nome da máquina de um campo depois que ele é criado

18

Eu espaçava enquanto digitava o nome do campo e agora o nome da máquina não é o que eu queria que fosse. Eu sei que é apenas um aborrecimento. mas estou me perguntando se existe alguma maneira de alterar o nome da máquina de um campo depois que ele é criado.

Suponho que isso me leve à segunda parte da minha pergunta. se eu criei um campo e ele não está mais sendo usado, como faço para excluí-lo, isso precisa ser feito no banco de dados ou em algum lugar da interface do usuário.

user379468
fonte

Respostas:

15

Em resumo, você não pode alterar o nome da máquina. Em teoria, é obviamente possível, mas exigirá um pouco de confusão com o banco de dados. Se você acabou de criar o campo, é muito mais fácil removê-lo e criar um novo.

O básico seria renomear todas as entradas field_confige field_config_instance, mas assim que você começar a usar o campo, os nomes das máquinas serão armazenados em centenas de lugares diferentes. Visualizações de configuração, painéis de configuração, Características e mais, e até então, mudar é não diversão.

A exclusão de campos pode ser feita em:, admin/structure/types/manage/[machine_name_of_content_type]/fieldsque você pode acessar na guia " Gerenciar campos " em qualquer tipo de conteúdo.

Letharion
fonte
Mas os campos ainda não permanecem no banco de dados, por exemplo, criei um novo campo com o nome do popper, no entanto, quando adiciono um novo campo a um tipo de conteúdo, o nome do campo antigo ainda aparece como uma opção. talvez eu não esteja entendendo exatamente como os campos funcionam.
precisa saber é o seguinte
11
Há uma funcionalidade que eu não investiguei muito, que exclui campos e seu conteúdo ao longo do tempo. O motivo é impedir que um site seja interrompido ao excluir um campo com milhares de entradas. Se o campo não for usado em nenhum lugar, eu esperaria que ele desaparecesse na próxima execução do cron.
Letharion
Eu tentei fazer um sed -i -es / old_field / new_field / em um código de site e despejo de banco de dados. Infelizmente, algo deu errado e depois que o site de restauração de despejo estava com defeito. Alguma idéia de como fazê-lo da maneira certa?
Dmitry Vyal
11
@Dmitry Vyal: O nome do campo é armazenado em alguns locais em uma matriz serializada - a substituição de uma string por outra de um comprimento diferente interromperia o unserialize () da matriz e provavelmente interromperia a próxima inicialização ou Drupal.
Charlie Schliesser
@ Charlie S: Obrigado, vai cuidar disso no futuro.
Dmitry Vyal
16

Meu procedimento é usar drush para clonar o campo primeiro e depois copiar os dados do campo com consultas de banco de dados na nova tabela de campos. Depois de verificar o conteúdo do campo clonado, excluo o campo original.

Faço-o desta maneira porque acho que o método drush de clonagem de campos sempre será pelo menos tão confiável quanto qualquer código de clonagem que eu possa criar, a consulta de cópia de dados é bastante simples e devo verificar o novo campo antes de excluir o original .

  1. drush field-clone field_my_field field_my_field_clone
  2. Inserir linhas em field_my_field_clone , por exemplo,INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Verifique o conteúdo de field_my_field_clone.
  4. Exclua o campo usando a interface do usuário, por exemplo, admin/structure/types/manage/my-content-type/fields
keithm
fonte
11
Isso é ótimo! Para D7: INSERIR field_data_field_my_field_clone SELECT * FROM field_data_field_my_field; INSERIR field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field;
joelpittet
Eu não sabia que havia um comando "drush field-clone"! Impressionante :)
Lovau
E as vistas, painéis, etc? Correções manuais?
Zkent
se você estiver usando drush, poderá excluir diretamente o campo drush field-delete xxxe também poderá gostar, drush sql-queryconforme sugerido por neubreed. @zkent, você vai ter de te ligar novamente o novo campo nas vistas, painéis existentes, etc.
Xaa
6

Eu escrevi um script de atualização, que na verdade cria um novo campo e instância com o novo nome da máquina, copia todos os dados antigos do campo para o novo e, por fim, exclui a instância antiga.

// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';

// Get old field info
$old_field = field_info_field($old_name);

// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;

if (!field_info_field($new_name)) {
  field_create_field($new_field);
}
else {
  field_update_field($new_field);
}

// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;

if (!field_info_instance($entity_type, $new_name, $bundle)) {
  field_create_instance($new_instance);
}
else {
  field_update_instance($new_instance);
}

// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($data = $field_data->fetchAssoc()) {
  $data_new = array();
  foreach ($data as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $data_new[$column] = $value;
  }
  db_insert('field_data_' . $new_name)
    ->fields($data_new)
    ->execute();
}

// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($revision = $field_revision->fetchAssoc()) {
  $revision_new = array();
  foreach ($revision as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $revision_new[$column] = $value;
  }
  db_insert('field_revision_' . $new_name)
    ->fields($revision_new)
    ->execute();
}

// Delete old instance
field_delete_instance($old_instance);

// Purge fields
field_purge_batch(1000);
Елин Й.
fonte
2

Eu só tinha que fazer isso e achei que não era muito difícil, mas meu site é bastante simples.

Tente o seguinte:

  1. Crie um novo campo com o nome próprio.
  2. Execute estas consultas no MySQL:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_revision_[OLD MACHINE NAME]` cf

(troque [NEW MACHNIE NAME] e [OLD MACHINE NAME] por field_your_field_names)

  1. Atualize todas as visualizações envolvidas para usar o novo campo e quaisquer outros módulos que apontem para esse campo específico (é aqui que as coisas podem ficar feias se o site for complicado). Você pode ver quaisquer visualizações que usam seu campo antigo aqui:/admin/reports/fields/views-fields
  2. Limpar cache do site
tmsimont
fonte
2

// Altere os nomes da tabela de armazenamento de campo. Aqui estamos alterando o nome da tabela antiga com o novo nome.

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// Altere os nomes dos campos nas tabelas field_config e field_instance_config.

db_update('field_config')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

db_update('field_config_instance')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();
sneha survey
fonte
1

Com a resposta clone de campo drush acima, você pode executar a última etapa do MySQL com Drush também (exemplo D7):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"
neubreed
fonte
0

Se você não quiser mexer no mysql, tente um script drush que escrevi chamado Field value copy.

Você precisará configurar seu novo campo primeiro e depois chamar

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Isso moverá os dados existentes para o novo campo, uma vez feito, exclua o campo antigo.

Pontus Nilsson
fonte
-3

Exporte o arquivo SQL do seu banco de dados, use a linha de comandos sedpara substituir todas as ocorrências do termo a ser alterado e reimporte seu banco de dados.

gvi
fonte
11
Diminuiu o voto do seu comentário porque essa abordagem causará estragos na instalação do Drupal, pois existem alguns lugares no banco de dados em que os nomes dos campos são serializados em PHP. Para mais informações sobre isso, consulte os comentários de @CharlieS (e outros) na resposta aceita acima.
Hargobind