Pembaruan bidang massal?

35

Saya menambahkan bidang (teks) baru ke tipe konten Drupal 7 yang sudah memiliki banyak node.

Bagaimana saya bisa mengisi bidang dengan nilai default untuk semua node ini?

daphshez
sumber

Jawaban:

37

Anda dapat menggunakan EntityFieldQueryuntuk mengambil daftar node, lalu perbarui bidang simpul dengan node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Jika ini adalah operasi satu kali, Anda dapat menggunakan fungsi Execute PHP modul Devel untuk menjalankan hal di atas: jika tidak, Anda dapat membuat modul kustom sederhana.

dreftymac
sumber
2
Selain menggunakan devel atau vbo, Anda juga dapat menggunakan "drush scr myscript.php" untuk mengeksekusi kode di atas dalam lingkungan yang sepenuhnya bootstrap.
fietserwin
Bagaimana kode ini berubah untuk mengakomodasi melakukan operasi yang sama ke bidang referensi istilah?
Screenack
17

Saya akan menggunakan Operasi Massal Tampilan dan menggunakan "Execute Arbitrary PHP Script" untuk melakukan hal-hal di atas, tetapi Anda tidak harus melakukan semua kode tambahan, hanya potongan kecil yang melakukan apa yang Anda inginkan (seperti $object->field_foo['und'][0]['value'] = 'some_value')

rfay
sumber
9

Jika Anda hanya ingin memperbarui bidang dengan beberapa nilai, maka alternatif yang lebih berkinerja untuk jawaban yang diterima adalah ini:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

Perbedaannya adalah dalam menggunakan langsung field_attach_presavedan field_attach_updatefungsi, yang memperbarui dengan benar hanya bidang simpul dan melewatkan sisa proses penyimpanan simpul. Ini berdampak bahwa tidak ada simpul presave / save node akan dipanggil, tanggal "berubah" tidak akan diperbarui ke tanggal saat ini dll. Menurut kasus penggunaan Anda mungkin lebih baik menggunakan seluruh proses node_save ().

Mirsoft
sumber
4

Memang VBO (Views Operasi Massal) adalah solusi yang baik. Selain itu, dengan versi terbaru, Anda akan menemukan opsi "Ubah nilai entitas" yang menyediakan cara yang sangat mudah untuk memperbarui bahasa node dalam satu operasi.

xaa
sumber
2

Instal dan aktifkan modul Operasi Massal Views dan buat tampilan dengan tampilan halaman.

Tambah => Operasi massal: Bidang Konten (Konten) yang terlihat.

Lihat

masukkan deskripsi gambar di sini

Pilih Bidang yang ingin Anda tetapkan nilai default.

Dalam kasus Anda, judulnya. Dalam gambar itu adalah tag.

Simpan tampilan, dan buka halaman yang dibuatnya. Jika Anda memiliki lebih dari satu halaman hasil, Anda dapat memilih untuk memilih semua item pada halaman saat ini, semua item pada semua halaman, atau Anda dapat secara manual menandai kotak yang sesuai dengan masing-masing node. Setidaknya satu kotak centang harus dicentang untuk melanjutkan.

Sekarang Anda menetapkan nilai default dan menyimpannya.

DRUPWAY
sumber