Basis data
Dimungkinkan untuk melakukan banyak hal dalam Drupal hanya dengan membuat query SQL, baik melalui Drupal atau secara eksternal. Secara umum, Anda tidak pernah ingin mengambil pendekatan ini. Ada beberapa kasus di mana itu bisa berfungsi dengan baik, tetapi sebagian besar waktu tidak ada alasan untuk melakukannya dengan cara ini.
API
Drupal memiliki API yang kaya, ini berlaku untuk Drupal 6, 7 dan 8, karena mereka selalu menjadi fitur utama dalam Drupal. Dalam contoh concreate Anda, Anda dapat menggunakan taxonomy_term_load
dan taxonomy_term_save
memfasilitasi pembaruan suatu istilah. Dengan cara ini, Anda dapat mengedit bagian data apa pun termasuk vid
. Hanya karena Anda melakukannya dengan API melakukan hal-hal terlarang tidak akan berfungsi secara otomatis, tetapi peluang semuanya berjalan dengan baik secara drastis ditingkatkan.
Dalam contoh konkret ini, API tidak melakukan apa pun yang diperlukan. Ini menetapkan beberapa data internal pada istilah tersebut dan memanggil modul hooks tahu bahwa telah diperbarui.
Anda harus mencatat bahwa banyak hal dapat rusak, jika istilah yang ingin Anda ubah adalah bagian dari hierarki. Hal-hal juga dapat dipecahkan untuk node yang merujuk istilah, jika bidang tidak diizinkan untuk merujuk istilah dalam kosakata baru.
Migrasi
Migrasi data adalah solusi anti peluru, dan kecuali Anda memiliki kumpulan data yang sangat besar, itu dapat dikembangkan dan dijalankan dengan mudah. Idenya adalah untuk membuat istilah baru dan memigrasi konten yang ingin Anda migrasi dan kemudian menghapus istilah lama. Sebagai pengait pembaruan, kode sampel dapat terlihat seperti ini:
/**
* Put in modules .install file, replace xxxx with 7000 or higher
*/
function MODULE_NAME_update_XXXX(&$sandbox) {
$term = taxonomy_term_load(CONSTANT_WITH_TID);
$new_term = clone $term;
unset($new_term->tid);
unset($new_term->tid);
$new_term->vid = CONSTANT_WITH_VID;
taxonomy_term_save($term);
// Find all nodes we want to update and update them.
// If there is a lot of nodes, can use $sandbox to make this a batch job.
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->fieldCondition('field_which_is_term_reference', 'tid', $term->tid);
$result = $query->execute();
foreach (node_load_multiple(array_keys($result['node'])) as $node) {
$node->field_which_is_term_reference[LANGUAGE_NONE][0]['tid'] = $term->tid;
node_save($node);
}
// Migration all done - delete the old term.
taxonomy_term_delete($term->tid);
}
Harap dicatat bahwa kode di atas adalah kode contoh murni, ditulis oleh hati. Mungkin memiliki kesalahan sintaks atau kesalahan lain dan membuat banyak asumsi. Ini hanya untuk mengilustrasikan ide dan menunjukkan bahwa migrasi mungkin bukan masalah besar.
Saya tidak akan merekomendasikan untuk mengubah istilah itu seperti yang Anda gambarkan dalam pertanyaan Anda. Alih-alih saya akan menggunakan pendekatan alternatif untuk mencapai hasil yang serupa (dalam urutan yang ditentukan), yang dirinci lebih lanjut di bawah ini.
Langkah 1 - Mulai gunakan istilah baru dalam pembaruan simpul di masa mendatang
Buat bidang istilah taksonomi baru, sehingga "mulai sekarang" setiap pembaruan node masa depan (atau node baru sedang dibuat) akan menggunakan bidang baru itu. Saya berasumsi istilah ini digunakan untuk node (jika Anda menggunakannya untuk beberapa jenis entitas lain, seperti pengguna, dll), pendekatan yang sama dapat digunakan untuk entitas tersebut juga.
Gunakan modul Aturan untuk membuat aturan seperti:
before saving content
.entity has field
, dengan bidang = bidang lama.entity has field
, dengan bidang = bidang baru).set Drupal message
yang berisi beberapa instruksi bahwa bidang lama harus dihapus, dan bidang baru harus berisi nilai yang sesuai.Langkah 2 - Gunakan Aturan untuk mempercepat proses
Jelas, pendekatan pada Langkah 1 akan memakan waktu "beberapa" jika ini harus dilakukan secara manual, 1 simpul pada satu waktu. Tetapi dengan menggunakan Views (untuk membuat daftar node yang serupa untuk diperbarui) dan VBO (untuk memperbarui daftar semacam itu secara massal) Anda mungkin (harus!) Dapat mempercepat proses ini sedikit.
Terutama jika Anda akan menggunakan Aturan untuk membuat operasi massal kustom untuk tampilan VBO tersebut, seperti yang dijelaskan dalam jawaban untuk " Bagaimana cara menggunakan Aturan untuk membuat operasi massal kustom untuk tampilan VBO? ". Berikut adalah prototipe Komponen Aturan yang seharusnya membantu mengimplementasikan operasi massal kustom tersebut (dalam format Aturan Ekspor):
Beberapa detail untuk menjelaskan prototipe di atas:
Ini adalah Ketentuan Ketentuan:
field_sample_tags
.field_demo_tags
.field_demo_tags
sesuai dengan istilah yang ingin kami ganti (dalam contoh ini, istilah tersebut memiliki id =1
). Perhatikan bahwa jika kondisi ini tidak dipenuhi, tidak ada Tindakan Aturan akan dilakukan.Ini adalah Tindakan Aturan:
field_sample_tags
sama dengan istilah dengan istilah id =31
(yang merupakan istilah dalam kosakata yang baru dibuat yang cocok dengan istilah dalam kosakata yang akan diganti).Term updated in node with id = 72
, sedangkan72
id node dari node yang diperbarui.Jika Anda mau, sesuaikan nama mesin dari nama bidang dalam prototipe di atas, dan ID istilah yang digunakan. Kemudian impor di situs Anda sendiri (menggunakan UI Aturan), dan QA-uji dengan menggunakan tautan "eksekusi" di sebelah kanan Komponen Aturan yang diimpor (dan masukkan beberapa id node untuk mengujinya, setelah Anda beralih ke "input langsung mode "untuk dapat menentukan id simpul). Jika selama pengujian Anda Anda tidak mendapatkan
Term updated in node ...
pesan seperti itu, itu pasti karena simpul yang Anda pilih tidak menggunakan nilai istilah yang ditentukan dalam Ketentuan aturan Anda.Langkah 3 - Gunakan VBO sebagai sentuhan akhir
Setelah Anda selesai QA, menguji Komponen Aturan ini dari Langkah 2, buat tampilan VBO dari node yang akan diproses, di mana Anda merujuk pada prototipe Aturan di atas (atau variasi darinya agar sesuai dengan kebutuhan Anda).
Manfaat dari pendekatan ini
Dengan menggunakan pendekatan ini, Anda meminimalkan risiko untuk memperkenalkan inkonsistensi data (dibandingkan dengan memperbarui database secara langsung), dengan tidak melibatkan kode khusus (Anda hanya akan menggunakan UI Tampilan dan UI Aturan).
sumber
Saya tahu bahwa Anda mengatakan secara pemrograman tetapi jika Anda ingin menggunakan modul Anda dapat menggunakan Taxonomy Manager
sumber