Perbarui semua node dengan bidang default setelah menambahkan bidang baru ke jenis konten

15

Saya memiliki tipe konten yang ada dengan sejumlah node. Saya baru saja menambahkan bidang boolean baru dengan nilai default "off."

Namun, hingga saya menyimpan kembali setiap node nilai default tidak diatur, sehingga tampilan yang seharusnya hanya menunjukkan node-node di mana bidang baru menggunakan nilai default saat ini kosong.

Bagaimana saya bisa memperbarui node yang ada, dibuat sebelum bidang telah ditambahkan, untuk mengatur bidang itu ke nilai default?

DanH
sumber
Saya memecahkan masalah ini dengan menggunakan Operasi dan Aturan Massal
Tambang
Modul resave node mungkin membantu Anda untuk memaksa pembaruan node.
Supriya Rajgopal

Jawaban:

9

Sayangnya, tidak ada cara yang sangat sederhana untuk melakukan ini (selain VBO / aturan), tapi inilah kode yang saya gunakan dalam fungsi pembaruan di file modul kustom saya menginstal file ketika saya perlu mempopulasikan nilai bidang untuk jenis simpul tertentu setelah menambahkan bidang baru ( dalam hal ini, 'halaman' node):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Metode manual lain yang disebutkan dalam jawaban ini menggunakan EntityFieldQuery dan memuat / menyimpan setiap node. Lebih banyak Drupal-y, tetapi jauh lebih sedikit performan ... (membutuhkan muatan simpul penuh dan menghemat operasi untuk setiap simpul!).

geerlingguy
sumber
Itu sangat menyedihkan
AlxVallejo
Pernahkah Anda melihat modul Field Defaults? dgo.to/field_defaults
forest
Ini adalah bug untuk menjalankan kode seperti ini tanpa juga membilas semua node yang terpengaruh dari cache load entitas: entity_get_controller('node')->resetCache($nids);- jika tidak, berikutnya node_load()dapat memuat data basi dari cache, dan objek mana pun node_save()yang akan menulis data basi itu kembali ke database.
phils
2

Taruhan terbaik adalah langsung di MySQl. Tabel akan terlihat seperti:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Jika Anda melihat mereka itu cukup mudah - apakah Anda perlu saya untuk mulai dengan apa yang akan terlihat seperti query atau apakah Anda baik-baik saja dari sini?

Mike
sumber
Terima kasih Mike, tidak, ini bukan masalah, saya bisa menangani SQL. Saya hanya merasa seperti harus ada opsi 'simpan ulang' atau sesuatu yang disediakan sebagai operasi massal, saya pikir saya mungkin melihat VBO dan integrasi Aturan untuk ini sebenarnya.
DanH
Dimengerti Saya berada di posisi yang sama, saya memigrasikan sekitar 30.000 artikel dari CMS lain ke Drupal. Saya tidak melihat titik untuk menambahkan modul lain ketika SQL cepat dan kotor. Mungkin Anda juga dapat menulis fungsi cepat yang akan memanggil node_load () untuk semua node Anda, yang mungkin berfungsi juga.
Mike
0

Coba saja logika di bawah ini. jauh lebih cepat dan dengan melewati semua implementasi hook juga. lebih detail . Anda dapat menulis kueri db_select langsung sederhana untuk mendapatkan semua nid's dan loop dengan kode sampel ini.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);
nadeesha meththananda
sumber
0

menggunakan sql, mengingat bahwa node dengan nilai field tidak diset adalah

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document menjadi tabel yang sesuai dengan bidang saya dan berisi satu nilai par nilai entri yang ditetapkan dengan entitas id yang merujuk node

saya menggunakan SQL insert ... select syntax

https://dev.mysql.com/doc/refman/5.5/id/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
Matoeil
sumber
0

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.

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
0

Saya menemukan cara mudah untuk memperbarui bidang dalam tipe konten dengan modul ini: Field Defaults

Lihat tangkapan layar. Anda dapat memperbarui konten yang ada dengan nilai default atau mempertahankan nilai yang ada.

Saya sudah mengujinya pada D7 dan berfungsi.

masukkan deskripsi gambar di sini

Sébastien Gicquel
sumber