Bagaimana cara mengubah nama mesin bidang setelah dibuat


18

Saya spasi ketika mengetik nama bidang dan sekarang nama mesin tidak seperti yang saya inginkan. Saya tahu ini hanya gangguan. tapi saya bertanya-tanya apakah ada cara untuk mengubah nama mesin dari suatu bidang setelah dibuat.

Saya kira ini menuntun saya ke bagian kedua dari pertanyaan saya. jika saya membuat bidang, dan itu tidak lagi digunakan, bagaimana cara menghapusnya, apakah ini harus dilakukan dari database, atau dapat dilakukan di suatu tempat di UI.

Jawaban:


15

Singkatnya, Anda tidak dapat mengubah nama mesin. Secara teori, itu jelas mungkin, tetapi akan membutuhkan sedikit mengacaukan database. Jika Anda baru saja membuat bidang, jauh lebih mudah untuk menghapusnya dan membuat yang baru.

Dasar-dasarnya adalah mengubah nama semua entri field_configdan field_config_instance, tetapi segera setelah Anda mulai menggunakan bidang, nama-nama mesin disimpan di seratus tempat berbeda. Tampilan konfigurasi, Konfigurasi panel , Fitur dan banyak lagi, dan pada saat itu, mengubahnya tidak menyenangkan.

Menghapus bidang dapat dilakukan pada:, admin/structure/types/manage/[machine_name_of_content_type]/fieldsyang dapat Anda jangkau melalui tab " Kelola bidang " pada semua jenis konten.


Tapi jangan bidang masih tetap dalam database, misalnya, saya membuat bidang baru dengan nama popper, namun ketika saya pergi untuk menambahkan bidang baru ke jenis konten, nama bidang lama masih muncul sebagai opsi .. mungkin saya tidak mengerti persis bagaimana bidang bekerja.
user379468

1
Ada fungsi yang belum sering saya selidiki, yang menghapus bidang dan isinya dari waktu ke waktu. Alasannya adalah untuk mencegah situs berhenti saat menghapus bidang dengan ribuan entri. Jika bidang itu tidak digunakan di mana pun, saya berharap itu akan hilang pada cron run berikutnya.
Letharion

Saya mencoba melakukan sed -i -es / old_field / new_field / pada kode situs dan dump basis data. Sayangnya, ada yang tidak beres dan setelah situs restorasi dump tidak berfungsi. Adakah ide bagaimana melakukannya dengan benar?
Dmitry Vyal

1
@Dmitry Vyal: Nama bidang disimpan di beberapa tempat dalam array bersambung - mengganti satu string dengan string lain dengan panjang berbeda akan merusak unserialize () dari array dan mungkin merusak bootstrap atau Drupal berikutnya.
Charlie Schliesser

@Charlie S: Terima kasih, akan membereskannya di masa depan.
Dmitry Vyal

16

Prosedur saya adalah menggunakan drush untuk mengkloning bidang terlebih dahulu, lalu menyalin data bidang dengan permintaan DB ke tabel bidang baru. Setelah saya memverifikasi konten bidang yang dikloning, saya menghapus bidang asli.

Saya melakukannya dengan cara ini karena saya pikir metode drush dari bidang kloning akan selalu paling tidak dapat diandalkan seperti kode kloning yang saya buat sendiri, permintaan salinan data cukup sederhana, dan saya bisa memeriksa bidang baru sebelum menghapus yang asli .

  1. drush field-clone field_my_field field_my_field_clone
  2. Masukkan baris ke field_my_field_clone, misalnya,INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. Verifikasi konten field_my_field_clone.
  4. Hapus bidang menggunakan UI, misalnya, admin/structure/types/manage/my-content-type/fields

1
Ini bagus! Untuk 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

Saya tidak tahu ada perintah "drush field-clone"! Luar biasa :)
Lovau

Bagaimana dengan tampilan, panel, dll? Perbaikan manual?
zkent

jika Anda menggunakan drush, Anda dapat menghapus langsung bidang itu drush field-delete xxxdan Anda juga bisa seperti yang drush sql-querydisarankan oleh neubreed. @ zkent, Anda akan memiliki tautan ulang bidang baru di tampilan yang ada, panel, dll.
xaa


6

Saya telah menulis skrip pembaruan, yang benar-benar membuat bidang baru dan contoh dengan nama mesin baru, menyalin semua data bidang lama ke yang baru dan terakhir menghapus contoh lama.

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

Saya hanya harus melakukan ini, dan ternyata tidak terlalu sulit, tetapi situs saya cukup sederhana.

Coba ini:

  1. Buat bidang baru dengan nama yang tepat.
  2. Jalankan pertanyaan ini di 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

(tukar [NAMA MESIN BARU] dan [NAMA MESIN TUA] dengan field_your_field_names)

  1. Perbarui setiap pandangan yang terlibat untuk menggunakan bidang baru, dan modul lain yang menunjuk ke bidang tertentu (di sinilah keadaan menjadi jelek jika situs Anda rumit). Anda dapat melihat tampilan apa pun yang menggunakan bidang lama Anda di sini:/admin/reports/fields/views-fields
  2. Bersihkan cache situs

2

// Ubah nama tabel penyimpanan bidang. Di sini kita mengubah nama tabel lama dengan nama baru.

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

// Ubah nama bidang dalam tabel field_config dan 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

Dengan jawaban klon-bidang drush di atas, Anda dapat melakukan langkah MySQL terakhir dengan Drush juga (contoh 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

Jika Anda tidak ingin bermain-main di mysql, Anda dapat mencoba skrip drush yang saya tulis disebut Salinan nilai bidang.

Anda harus mengatur bidang baru Anda terlebih dahulu dan kemudian menelepon

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

Ini akan memindahkan data yang ada ke bidang baru setelah selesai menghapus bidang yang lama.



-3

Ekspor file SQL dari database Anda, gunakan baris perintah seduntuk mengganti semua kemunculan istilah untuk berubah, dan impor kembali database Anda.


1
Turunkan komentar Anda karena pendekatan ini akan mendatangkan malapetaka pada instalasi Drupal Anda karena ada beberapa tempat dalam database di mana nama bidang adalah serial PHP. Untuk informasi lebih lanjut tentang ini, lihat komentar dari @CharlieS (dan lainnya) di bawah jawaban yang diterima di atas.
hargobind
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.