Come posso cambiare il nome della macchina di un campo una volta che è stato creato


18

Ho spaziato mentre scrivevo il nome del campo e ora il nome della macchina non è quello che volevo che fosse. So che è solo un fastidio. ma mi chiedo se c'è un modo per modificare il nome della macchina di un campo una volta creato.

Suppongo che questo mi porti alla seconda parte della mia domanda. se ho creato un campo e non viene più utilizzato, come posso fare per cancellarlo, è necessario farlo dal database o può essere fatto da qualche parte nell'interfaccia utente.

Risposte:


15

In breve, non è possibile modificare il nome della macchina. In teoria, è ovviamente possibile, ma richiederà un po 'di confusione con il database. Se hai appena creato il campo, è molto più semplice rimuoverlo e crearne uno nuovo.

La base sarebbe quella di rinominare tutte le voci field_confige field_config_instance, ma non appena si inizia a utilizzare il campo, i nomi delle macchine vengono memorizzati in centinaia di luoghi diversi. Visualizzazioni config, pannelli di configurazione, caratteristiche e di più, e poi, cambiando è non è divertente.

L'eliminazione dei campi può essere eseguita su:, admin/structure/types/manage/[machine_name_of_content_type]/fieldsche puoi raggiungere tramite la scheda " Gestisci campi " su qualsiasi tipo di contenuto.


Ma i campi non rimangono ancora nel database, ad esempio, ho creato un nuovo campo con il nome popper, tuttavia quando vado ad aggiungere un nuovo campo a un tipo di contenuto, il vecchio nome del campo appare ancora come un'opzione .. forse non capisco esattamente come funzionano i campi.
user379468,

1
C'è una funzionalità che non ho studiato molto, che elimina i campi e il loro contenuto nel tempo. Il motivo è impedire che un sito si interrompa quando si eliminano campi con migliaia di voci. Se il campo non viene utilizzato da nessuna parte, mi aspetterei che scompaia nella prossima cron run.
Letharion,

Ho provato a fare un sed -i -es / old_field / new_field / su un dump del codice del sito e del database. Sfortunatamente, qualcosa è andato storto e dopo che il sito di restauro della discarica non funzionava correttamente. Qualche idea su come farlo nel modo giusto?
Dmitry Vyal,

1
@Dmitry Vyal: il nome del campo è memorizzato in alcuni punti in un array serializzato - la sostituzione di una stringa con un'altra stringa di diversa lunghezza interromperà il unserialize () dell'array e probabilmente spezzerebbe il prossimo bootstrap o Drupal.
Charlie Schliesser,

@Charlie S: Grazie, ci penseremo noi in futuro.
Dmitry Vyal

16

La mia procedura consiste nell'utilizzare drush per clonare prima il campo, quindi copiare i dati del campo con le query DB nella nuova tabella dei campi. Dopo aver verificato il contenuto del campo clonato, cancello il campo originale.

Lo faccio in questo modo perché penso che il metodo drush dei campi di clonazione sia sempre affidabile almeno quanto qualsiasi codice di clonazione che potrei creare da solo, la query di copia dei dati è piuttosto semplice e riesco a controllare il nuovo campo prima di eliminare l'originale .

  1. drush field-clone field_my_field field_my_field_clone
  2. Inserisci righe in field_my_field_clone, ad es.INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Verifica il contenuto di field_my_field_clone.
  4. Elimina il campo utilizzando l'interfaccia utente, ad es. admin/structure/types/manage/my-content-type/fields

1
Questo è fantastico! Per D7: INSERISCI field_data_field_my_field_clone SELEZIONA * FROM field_data_field_my_field; INSERISCI field_revision_field_my_field_clone SELEZIONA * DA field_revision_field_my_field;
Joelpittet,

Non sapevo che ci fosse un comando "drush field-clone"! Fantastico :)
Lovau

Che dire di viste, pannelli, ecc.? Correzioni manuali?
zkent,

se stai usando drush puoi direttamente cancellare il campo con drush field-delete xxxe ti potrebbe piacere anche come drush sql-querysuggerito da neubreed. @zkent, dovrai ricollegare il nuovo campo nelle viste, pannelli, ecc
esistenti


6

Ho scritto uno script di aggiornamento, che in realtà crea un nuovo campo e un'istanza con il nuovo nome della macchina, copia tutti i vecchi dati del campo in quello nuovo e infine elimina la vecchia istanza.

// 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);

2

Ho dovuto farlo e ho scoperto che non era troppo difficile, ma il mio sito è abbastanza semplice.

Prova questo:

  1. Crea un nuovo campo con il nome corretto.
  2. Esegui queste query in 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

(sostituire [NEW MACHNIE NAME] e [OLD MACHINE NAME] con field_your_field_names)

  1. Aggiorna tutte le visualizzazioni coinvolte per utilizzare il nuovo campo e tutti gli altri moduli che puntano a quel campo specifico (è qui che le cose potrebbero diventare brutte se il tuo sito è complicato). Puoi vedere qualsiasi vista che utilizza il tuo vecchio campo qui:/admin/reports/fields/views-fields
  2. Cancella la cache del sito

2

// Modifica i nomi delle tabelle di archiviazione dei campi. Qui stiamo modificando il nome della vecchia tabella con un nuovo nome.

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

// Modifica i nomi dei campi nelle tabelle 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();

1

Con la drush field-clone answer sopra puoi eseguire l'ultimo passaggio di MySQL anche con Drush (esempio 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"

0

Se non vuoi giocherellare in mysql puoi provare uno script drush che ho scritto chiamato Copia valore campo.

Dovrai prima impostare il tuo nuovo campo e poi chiamare

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

In questo modo i dati esistenti verranno spostati nel nuovo campo una volta terminato, eliminare il vecchio campo.



-3

Esporta il file SQL del tuo database, utilizza la riga di comando sedper sostituire tutte le occorrenze del termine da modificare e reimporta il database.


1
Il tuo commento è stato sottovalutato perché questo approccio causerà il caos sulla tua installazione di Drupal poiché ci sono alcuni punti nel database in cui i nomi dei campi sono serializzati in PHP. Per ulteriori informazioni al riguardo, vedere i commenti di @CharlieS (e altri) nella risposta accettata sopra.
Hargobind,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.