Wie ändere ich den Computernamen eines Feldes, nachdem es erstellt wurde?

18

Ich habe beim Eingeben des Feldnamens Abstand genommen und nun ist der Computername nicht mehr so, wie ich es wollte. Ich weiß, es ist nur ein Ärger. Aber ich frage mich, ob es eine Möglichkeit gibt, den Computernamen eines Feldes zu ändern, sobald es erstellt wurde.

Ich nehme an, das führt mich in den zweiten Teil meiner Frage. Wenn ich ein Feld erstellt habe und es nicht mehr verwendet wird, wie lösche ich es, muss dies aus der Datenbank erfolgen oder kann es irgendwo in der Benutzeroberfläche erfolgen?

user379468
quelle

Antworten:

15

Kurz gesagt, Sie können den Computernamen nicht ändern. Theoretisch ist es natürlich möglich, aber es wird einiges an Verwirrung mit der Datenbank erfordern. Wenn Sie das Feld gerade erst erstellt haben, ist es viel einfacher, es zu entfernen und ein neues zu erstellen.

Die Basis wäre, alle Einträge auf field_configund umzubenennen field_config_instance, aber sobald Sie anfangen, das Feld zu benutzen, werden die Maschinennamen an hundert verschiedenen Stellen gespeichert. Zeigt config, Panels config, Features und mehr an und bis dahin macht das Ändern keinen Spaß.

Das Löschen von Feldern kann erfolgen über:, admin/structure/types/manage/[machine_name_of_content_type]/fieldsden Sie über die Registerkarte " Felder verwalten " für jeden Inhaltstyp erreichen können.

Letharion
quelle
Bleiben die Felder jedoch nicht weiterhin in der Datenbank, habe ich beispielsweise ein neues Feld mit dem Popper-Namen erstellt. Wenn ich jedoch einem Inhaltstyp ein neues Feld hinzufüge, wird der alte Feldname weiterhin als Option angezeigt. Vielleicht verstehe ich nicht genau, wie Felder funktionieren.
user379468
1
Es gibt eine Funktion, die ich nicht viel untersucht habe und die Felder und deren Inhalt im Laufe der Zeit löscht. Der Grund ist, zu verhindern, dass eine Site zum Stillstand kommt, wenn Felder mit Tausenden von Einträgen gelöscht werden. Wenn das Feld nirgendwo verwendet wird, würde ich erwarten, dass es beim nächsten Cron-Lauf verschwindet.
Letharion
Ich habe versucht, ein sed -i -es / old_field / new_field / auf einem Site-Code- und Datenbank-Dump durchzuführen. Leider ist etwas schief gelaufen und nach der Deponierestaurierung war eine Fehlfunktion aufgetreten. Irgendwelche Ideen, wie man es richtig macht?
Dmitry Vyal
1
@Dmitry Vyal: Der Feldname wird an einigen Stellen in einem serialisierten Array gespeichert. Wenn Sie eine Zeichenfolge durch eine andere Zeichenfolge mit einer anderen Länge ersetzen, wird die unserialize () des Arrays und wahrscheinlich der nächste Bootstrap oder Drupal beschädigt.
Charlie Schliesser
@Charlie S: Danke, werde mich in Zukunft darum kümmern.
Dmitry Vyal
16

Mein Verfahren besteht darin, zuerst das Feld mit drush zu klonen und dann die Felddaten mit DB-Abfragen in die neue Feldtabelle zu kopieren. Nachdem ich den Inhalt des geklonten Felds überprüft habe, lösche ich das ursprüngliche Feld.

Ich mache das so, weil ich denke, dass die Drush-Methode zum Klonen von Feldern immer mindestens so zuverlässig ist wie jeder Kloncode, den ich selbst erstellen könnte, die Abfrage der Datenkopie ist ziemlich einfach und ich kann das neue Feld überprüfen, bevor ich das Original lösche .

  1. drush field-clone field_my_field field_my_field_clone
  2. Zeilen einfügen in field_my_field_clonezBINSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Überprüfen Sie den Inhalt von field_my_field_clone.
  4. Löschen Sie das Feld über die Benutzeroberfläche, z. admin/structure/types/manage/my-content-type/fields
keithm
quelle
1
Das ist toll! Für D7: INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field; INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field;
Joelpittet
Ich wusste nicht, dass es einen "Drush Field-Clone" -Befehl gibt!
Super
Was ist mit Ansichten, Panels usw.? Manuelle Korrekturen?
Mittwoch,
wenn du drush verwendest kannst du das feld direkt mit löschen drush field-delete xxxund das könnte dir auch gefallen drush sql-querywie von neubreed vorgeschlagen. @ zkent, Sie müssen das neue Feld in den vorhandenen Ansichten, Bedienfeldern usw. neu
verknüpfen
6

Ich habe ein Update-Skript geschrieben, das tatsächlich ein neues Feld und eine neue Instanz mit dem neuen Computernamen erstellt, alle alten Felddaten in die neue kopiert und zuletzt die alte Instanz löscht.

// 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);
Елин Й.
quelle
2

Ich musste das einfach tun und fand es nicht allzu schwierig, aber meine Seite ist ziemlich einfach.

Versuche dies:

  1. Erstellen Sie ein neues Feld mit dem richtigen Namen.
  2. Führen Sie diese Abfragen in MySQL aus:
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

(Tauschen Sie [NEW MACHNIE NAME] und [OLD MACHINE NAME] mit aus. field_your_field_names)

  1. Aktualisieren Sie alle beteiligten Ansichten, um das neue Feld und alle anderen Module zu verwenden, die auf dieses bestimmte Feld verweisen (hier kann es bei komplizierten Websites zu Problemen kommen). Hier können Sie alle Ansichten sehen, die Ihr altes Feld verwenden:/admin/reports/fields/views-fields
  2. Löschen Sie den Site-Cache
tmsimont
quelle
2

// Ändern Sie die Namen der Feldspeichertabellen. Hier ändern wir den Namen der alten Tabelle durch einen neuen Namen.

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

// Ändern Sie die Feldnamen in den Tabellen field_config und 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 surve
quelle
1

Mit der obigen Antwort drush field-clone können Sie den letzten MySQL-Schritt auch mit Drush ausführen (Beispiel 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
quelle
0

Wenn Sie nicht in MySQL herumspielen möchten, können Sie ein Drush-Skript ausprobieren, das ich geschrieben habe und das Feldwertkopie heißt.

Sie müssen zuerst Ihr neues Feld einrichten und dann anrufen

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Dadurch werden vorhandene Daten in das neue Feld verschoben, sobald das alte Feld gelöscht wurde.

Pontus Nilsson
quelle
-3

Exportieren Sie die SQL-Datei Ihrer Datenbank, verwenden Sie die Befehlszeile sed, um alle Vorkommen des zu ändernden Begriffs zu ersetzen, und importieren Sie Ihre Datenbank erneut.

gvi
quelle
1
Sie haben Ihren Kommentar abgelehnt, weil dieser Ansatz Ihre Drupal-Installation verwüsten wird, da es in der Datenbank einige Stellen gibt, an denen die Feldnamen mit PHP serialisiert sind. Weitere Informationen hierzu finden Sie in den Kommentaren von @CharlieS (und anderen) unter der oben akzeptierten Antwort.
Hargobind