it-swarm-id.com

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

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?

15
DanH

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, simpul 'halaman'):

<?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!).

10
geerlingguy

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?

2
Mike

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);

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/en/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)
0
Matoeil

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

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

Lihat

enter image description here

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.

0
DRUPWAY

Saya menemukan cara mudah untuk memperbarui bidang dalam tipe konten dengan modul ini: Default Lapangan

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

Saya sudah mengujinya pada D7 dan berfungsi.

enter image description here

0