Apakah dapat diterima untuk mengubah kolom vid dari istilah yang terprogram dalam basis data?


8

Saya perlu memindahkan beberapa istilah dari satu kosakata ke kosakata lain dengan menyimpan semua datanya: terjemahan, alias, dan referensi simpul.

Apakah dapat diterima untuk mengubah vidnilai kolomnya langsung di database? Persyaratan tidak memiliki hubungan hierarki yang perlu ditangani.

Jawaban:


11

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_loaddan taxonomy_term_savememfasilitasi 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.


4

Tidak disarankan untuk melakukan perubahan basis data langsung ketika bekerja dengan Drupal. Tapi Ya, jika kita tahu di mana semua itu dapat berdampak dan melakukan perubahan yang diperlukan, tidak apa - apa untuk melakukan perubahan langsung dalam database. Karena dalam hal ini hal ini tidak dimungkinkan melalui UI. CATATAN: Jika Anda memiliki simpul yang terkait dengan Term, Anda juga harus mengatasinya secara manual.

Lihat tautan ini yang menjelaskan bagaimana kami dapat mengubah istilah kosakata di Drupal 7: Ubah kosakata istilah taksonomi di Drupal 7 menggunakan database .


Satu-satunya masalah yang saya lihat dalam hal ini adalah - jika dalam kasus ini, ada bidang yang terlampir pada istilah dengan beberapa nilai dan Anda mengubah vid-nya, maka data yang disimpan dalam bidang tersebut akan hilang.
Ashish Deynap

Ya, itu sebabnya saya juga menyebutkan bahwa, jika ada node yang terpasang maka mereka perlu ditangani juga .
Yogesh

Tetapi apakah ada data yang terlampir pada term oleh vid juga? bukan hanya dengan kunci tid?
Molfar

Tidak, data apa pun yang terlampir pada istilah terkait dengan tid. vid digunakan untuk merujuk hanya id kosakata, tidak ada yang lain.
Yogesh

4

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:

  • Aturan acara: before saving content.
  • Ketentuan aturan:
    • entity has field, dengan bidang = bidang lama.
    • DAN BUKAN ( entity has field, dengan bidang = bidang baru).
  • Aturan Tindakan:, set Drupal messageyang 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):

{ "rules_replace_a_term_field_by_another_term_field" : {
    "LABEL" : "Replace a term field by another term field",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "node" : { "label" : "Node", "type" : "node" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_sample_tags" } },
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_demo_tags" } },
      { "data_is" : { "data" : [ "node:field-demo-tags" ], "value" : "1" } }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "node:field-sample-tags" ], "value" : "31" } },
      { "drupal_message" : { "message" : "Term updated in node with id = [node:nid]" } }
    ]
  }
}

Beberapa detail untuk menjelaskan prototipe di atas:

  • Ia menggunakan simpul sebagai parameter.
  • Ini adalah Ketentuan Ketentuan:

    • periksa apakah entitas (= simpul) memiliki bidang field_sample_tags.
    • periksa apakah entitas (= simpul) memiliki bidang field_demo_tags.
    • periksa apakah nilai bidang field_demo_tagssesuai 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:

    • Tetapkan nilai bidang field_sample_tagssama dengan istilah dengan istilah id = 31(yang merupakan istilah dalam kosakata yang baru dibuat yang cocok dengan istilah dalam kosakata yang akan diganti).
    • Menampilkan pesan di situs like Term updated in node with id = 72, sedangkan 72id 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).


Anda berasumsi bahwa pandangan, VBO dan aturan sudah diinstal, jika tidak, Anda perlu menginstal 3 modul untuk solusi ini. Selain itu, "kode" konfigurasi yang perlu Anda implementasikan tidak kalah rumit dari apa yang diperlukan untuk dilakukan dalam kait pembaruan. Maksud saya adalah bahwa menggunakan aturan dan pandangan tidak sesederhana yang Anda buat itu terdengar. Perlu juga diingat bahwa walaupun Anda dapat membuat hampir semua hal dengan Tampilan dan Aturan, melakukannya tidak selalu merupakan ide yang baik.
googletorp

1
Ya memang: untuk menggunakan Tampilan, Aturan atau VBO, modul harus diinstal (+ diaktifkan). Tapi dari sekitar 990K situs D7, ada sekitar 810K situs yang juga memiliki Views , itu lebih dari 80%. Dan untuk situs yang tidak memiliki alasan untuk menggunakan Aturan atau VBO: modul-modul itu hanya diperlukan untuk melakukan konversi seperti itu (jika sudah selesai mereka dapat dihapus jika Anda mau). Tentang kesederhanaan: IMO itu agak masalah pengalaman. Keuntungan dari pendekatan ini, adalah bahwa itu hanya membutuhkan keterampilan membangun situs (pengembang PHP yang berpengalaman mungkin tidak tersedia / terjangkau).
Pierre.Vriens

2

Saya tahu bahwa Anda mengatakan secara pemrograman tetapi jika Anda ingin menggunakan modul Anda dapat menggunakan Taxonomy Manager

Modul ini menyediakan antarmuka yang kuat untuk mengelola taksonomi. Sebuah kosakata ditampilkan dalam tampilan hierarki dinamis, tempat istilah induk dapat diperluas untuk mencantumkan istilah anak bersarang mereka atau dapat diciutkan.

Manajer Taksonomi memiliki operasi berikut dan fitur utama:

  • tampilan pohon yang dinamis
  • penghapusan massal
  • penambahan massal istilah baru
  • memindahkan istilah dalam hierarki yang menggabungkan istilah (menggunakan modul gabungan istilah di 7.x)
  • perubahan berat cepat dengan panah atas dan bawah (dan penghematan AJAX)
  • Formulir pengeditan istilah bertenaga AJAX
  • antarmuka pencarian sederhana
  • CSV Ekspor persyaratan
  • i18n mendukung kosakata multibahasa (per istilah bahasa)
  • Antarmuka Double Tree untuk memindahkan istilah dalam hierarki, menambahkan terjemahan baru dan beralih istilah antara berbagai kosa kata
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.